Prechádzať zdrojové kódy

refactor(更新)
- 流程模式的新增,替换原先的锁定模式
- 流程模式的界面修改

周文健 4 mesiacov pred
rodič
commit
cd499660e5
100 zmenil súbory, kde vykonal 3091 pridanie a 1410 odobranie
  1. BIN
      app/src/main/assets/data.db
  2. 1 1
      app/src/main/java/com/grkj/iscs/features/login/activity/LoginActivity.kt
  3. 2 2
      app/src/main/java/com/grkj/iscs/features/main/dialog/TextDropDownDialog.kt
  4. 7 5
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddUserDialog.kt
  5. 6 3
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdateUserDialog.kt
  6. 5 1
      app/src/main/java/com/grkj/iscs/features/main/entity/MenuItemEntity.kt
  7. 22 28
      app/src/main/java/com/grkj/iscs/features/main/fragment/home/HomeFragment.kt
  8. 64 35
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateJobFragment.kt
  9. 46 29
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateSopFragment.kt
  10. 42 19
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateSopJobFragment.kt
  11. 63 42
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditJobFragment.kt
  12. 67 45
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditSopFragment.kt
  13. 56 29
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditSopJobFragment.kt
  14. 49 33
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobExecuteFragment.kt
  15. 37 11
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobManageHomeFragment.kt
  16. 0 7
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/UserManageViewModel.kt
  17. 16 4
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/home/HomeViewModel.kt
  18. 44 5
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobExecuteViewModel.kt
  19. 23 0
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobManageHomeViewModel.kt
  20. 34 8
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobViewModel.kt
  21. 36 9
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/SopJobViewModel.kt
  22. 31 3
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/SopViewModel.kt
  23. 12 12
      app/src/main/java/com/grkj/iscs/features/splash/activity/SplashActivity.kt
  24. 0 26
      app/src/main/java/com/grkj/iscs/utils/LockModeExtension.kt
  25. 166 94
      app/src/main/res/layout-land/fragment_create_job.xml
  26. 167 94
      app/src/main/res/layout-land/fragment_create_sop.xml
  27. 168 97
      app/src/main/res/layout-land/fragment_create_sop_job.xml
  28. 166 93
      app/src/main/res/layout-land/fragment_edit_job.xml
  29. 165 92
      app/src/main/res/layout-land/fragment_edit_sop.xml
  30. 169 95
      app/src/main/res/layout-land/fragment_edit_sop_job.xml
  31. 3 3
      app/src/main/res/layout-land/fragment_home.xml
  32. 1 1
      app/src/main/res/layout-land/fragment_job_execute.xml
  33. 1 1
      app/src/main/res/layout-land/fragment_point_manage.xml
  34. 4 4
      app/src/main/res/layout-land/fragment_select_memeber.xml
  35. 4 4
      app/src/main/res/layout-land/fragment_select_point.xml
  36. 51 0
      app/src/main/res/layout-land/item_job_workflow_step.xml
  37. 160 135
      app/src/main/res/layout/dialog_add_user.xml
  38. 159 135
      app/src/main/res/layout/dialog_update_user.xml
  39. 1 1
      app/src/main/res/layout/fragment_card_manage.xml
  40. 81 13
      app/src/main/res/layout/fragment_create_job.xml
  41. 88 17
      app/src/main/res/layout/fragment_create_sop.xml
  42. 77 10
      app/src/main/res/layout/fragment_create_sop_job.xml
  43. 69 10
      app/src/main/res/layout/fragment_edit_job.xml
  44. 68 11
      app/src/main/res/layout/fragment_edit_sop.xml
  45. 65 9
      app/src/main/res/layout/fragment_edit_sop_job.xml
  46. 1 1
      app/src/main/res/layout/fragment_exception_job_manage.xml
  47. 3 3
      app/src/main/res/layout/fragment_home.xml
  48. 1 1
      app/src/main/res/layout/fragment_in_progress_job_manage.xml
  49. 1 1
      app/src/main/res/layout/fragment_job_execute.xml
  50. 1 1
      app/src/main/res/layout/fragment_job_manage.xml
  51. 1 1
      app/src/main/res/layout/fragment_key_manage.xml
  52. 1 1
      app/src/main/res/layout/fragment_lock_manage.xml
  53. 1 1
      app/src/main/res/layout/fragment_locked_point.xml
  54. 1 1
      app/src/main/res/layout/fragment_point_manage.xml
  55. 1 1
      app/src/main/res/layout/fragment_reset_password.xml
  56. 1 1
      app/src/main/res/layout/fragment_rfid_token_manage.xml
  57. 1 1
      app/src/main/res/layout/fragment_role_manage.xml
  58. 4 4
      app/src/main/res/layout/fragment_select_memeber.xml
  59. 4 4
      app/src/main/res/layout/fragment_select_point.xml
  60. 1 1
      app/src/main/res/layout/fragment_sop_manage.xml
  61. 1 1
      app/src/main/res/layout/fragment_user_info.xml
  62. 1 1
      app/src/main/res/layout/fragment_user_manage.xml
  63. 1 1
      app/src/main/res/layout/fragment_workstation_manage.xml
  64. 10 7
      app/src/main/res/layout/item_home_menu.xml
  65. 1 1
      app/src/main/res/layout/item_home_text_drop_down.xml
  66. 51 0
      app/src/main/res/layout/item_job_workflow_step.xml
  67. BIN
      app/src/main/res/mipmap-xhdpi/icon_job_manage_create_job.png
  68. BIN
      app/src/main/res/mipmap-xhdpi/icon_job_manage_create_sop.png
  69. BIN
      app/src/main/res/mipmap-xhdpi/icon_job_manage_in_progress_job.png
  70. BIN
      app/src/main/res/mipmap-xhdpi/icon_job_manage_sop_manage.png
  71. 3 1
      app/src/main/res/values-en/strings.xml
  72. 6 2
      app/src/main/res/values-land/dimens.xml
  73. 3 1
      app/src/main/res/values-zh/strings.xml
  74. 8 1
      app/src/main/res/values/dimens.xml
  75. 3 1
      app/src/main/res/values/strings.xml
  76. 3 3
      data/src/main/java/com/grkj/data/dao/IsSopDao.kt
  77. 19 6
      data/src/main/java/com/grkj/data/dao/JobTicketDao.kt
  78. 60 0
      data/src/main/java/com/grkj/data/dao/WorkflowStepDao.kt
  79. 8 1
      data/src/main/java/com/grkj/data/database/ISCSDatabase.kt
  80. 2 0
      data/src/main/java/com/grkj/data/di/AppEntryPoint.kt
  81. 4 0
      data/src/main/java/com/grkj/data/di/DatabaseModule.kt
  82. 3 2
      data/src/main/java/com/grkj/data/di/RepositoryManager.kt
  83. 8 0
      data/src/main/java/com/grkj/data/di/RepositoryModule.kt
  84. 0 40
      data/src/main/java/com/grkj/data/enums/LockModeEnum.kt
  85. 0 14
      data/src/main/java/com/grkj/data/enums/LockStepEnum.kt
  86. 3 5
      data/src/main/java/com/grkj/data/model/dos/IsJobTicket.kt
  87. 2 0
      data/src/main/java/com/grkj/data/model/dos/IsJobTicketStep.kt
  88. 2 2
      data/src/main/java/com/grkj/data/model/dos/IsSop.kt
  89. 66 0
      data/src/main/java/com/grkj/data/model/dos/WorkflowMode.kt
  90. 124 0
      data/src/main/java/com/grkj/data/model/dos/WorkflowStep.kt
  91. 120 0
      data/src/main/java/com/grkj/data/model/dos/WorkflowStepTemplate.kt
  92. 1 0
      data/src/main/java/com/grkj/data/model/vo/AddUserDataVo.kt
  93. 1 1
      data/src/main/java/com/grkj/data/model/vo/JobTicketManageVo.kt
  94. 1 1
      data/src/main/java/com/grkj/data/model/vo/SopManageVo.kt
  95. 1 0
      data/src/main/java/com/grkj/data/model/vo/UpdateUserDataVo.kt
  96. 0 5
      data/src/main/java/com/grkj/data/repository/IHardwareRepository.kt
  97. 8 3
      data/src/main/java/com/grkj/data/repository/IJobTicketRepository.kt
  98. 1 1
      data/src/main/java/com/grkj/data/repository/ISopRepository.kt
  99. 47 0
      data/src/main/java/com/grkj/data/repository/IWorkflowRepository.kt
  100. 0 10
      data/src/main/java/com/grkj/data/repository/impl/HardwareRepository.kt

BIN
app/src/main/assets/data.db


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

@@ -93,7 +93,7 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>() {
     override fun initData() {
         super.initData()
         //todo 测试用,直接创建管理员账号
-//        viewModel.insertAdminAccount().observe(this){}
+        viewModel.insertAdminAccount().observe(this){}
         requestPermissionsIfNeeded(*Constants.needPermission) {
             if (it) {
                 logger.info("权限获取成功")

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

@@ -103,7 +103,7 @@ class TextDropDownDialog(
      * 下拉弹窗数据实体接口
      */
     interface TextDropDownEntity {
-        fun getId(): Long
+        fun getId(): Long?
         fun getTag(): String
         fun getShowText(): String
         fun getData(): Any?
@@ -115,7 +115,7 @@ class TextDropDownDialog(
      * 简易实现
      */
     class SimpleTextDropDownEntity(
-        var dataId: Long = 0,
+        var dataId: Long? = null,
         var dataObject: Any? = null,
         val dataTag: String = "",
         var dataText: String = ""

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

@@ -35,7 +35,8 @@ class AddUserDialog(
         dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
         // 根据配置显示/隐藏工作站选择
-        binding.workstationLayout.isVisible = ISCSConfig.isWorkstationOn
+        binding.workstationTv.isVisible = ISCSConfig.isWorkstationOn
+        binding.workstationNameTv.isVisible = ISCSConfig.isWorkstationOn
 
         // 角色多选
         binding.roleTv.setOnClickListener {
@@ -61,10 +62,11 @@ class AddUserDialog(
         binding.confirm.setOnClickListener {
             if (!checkData()) return@setOnClickListener
             val vo = AddUserDataVo(
-                binding.nicknameEt.text.toString(),
-                binding.cardcodeEt.text.toString(),
-                selectedRoles.map { it.getId() },
-                selectedWorkstations.map { it.getId() },
+                binding.usernameEt.text.trim().toString(),
+                binding.nicknameEt.text.trim().toString(),
+                binding.cardcodeEt.text.trim().toString(),
+                selectedRoles.mapNotNull { it.getId() },
+                selectedWorkstations.mapNotNull { it.getId() },
                 binding.statusRg.checkedRadioButtonId == binding.activateRb.id
             )
             onConfirm(vo)

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

@@ -37,7 +37,8 @@ class UpdateUserDialog(
         dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
         // 显示或隐藏工作站选项
-        binding.workstationLayout.isVisible = ISCSConfig.isWorkstationOn
+        binding.workstationTv.isVisible = ISCSConfig.isWorkstationOn
+        binding.workstationNameTv.isVisible = ISCSConfig.isWorkstationOn
 
         // 预填数据
         binding.nicknameEt.setText(userVo.nickName)
@@ -73,6 +74,7 @@ class UpdateUserDialog(
 
         // 确认
         binding.confirm.setOnClickListener {
+            val username = binding.usernameEt.text.trim().toString()
             val name = binding.nicknameEt.text.trim().toString()
             val card = binding.cardcodeEt.text.trim().toString()
             if (name.isBlank()) return@setOnClickListener PopTip.build().tipDialog(R.string.please_input_nickname)
@@ -82,10 +84,11 @@ class UpdateUserDialog(
             val isActive = binding.statusRg.checkedRadioButtonId == binding.activateRb.id
             val updateVo = UpdateUserDataVo(
                 userVo.userId,
+                username,
                 name,
                 card,
-                selectedRoles.map { it.getId() },
-                selectedWorkstations.map { it.getId() },
+                selectedRoles.mapNotNull { it.getId() },
+                selectedWorkstations.mapNotNull { it.getId() },
                 isActive
             )
             onConfirm(updateVo)

+ 5 - 1
app/src/main/java/com/grkj/iscs/features/main/entity/MenuItemEntity.kt

@@ -1,5 +1,7 @@
 package com.grkj.iscs.features.main.entity
 
+import com.google.android.material.badge.BadgeDrawable
+
 /**
  * 菜单实体
  * type 菜单类型 0-用户管理 1-角色管理 2-区域管理 3-点位管理
@@ -8,5 +10,7 @@ data class MenuItemEntity(
     val type: Int,
     val menuIconId: Int,
     val menuText: String,
-    val permission: String
+    val permission: String,
+    var badgeNum: Int = 0,
+    var badgeDrawable: BadgeDrawable? = null
 )

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

@@ -2,25 +2,17 @@ package com.grkj.iscs.features.main.fragment.home
 
 import android.widget.LinearLayout
 import android.widget.TextView
-import androidx.core.view.isVisible
 import androidx.fragment.app.viewModels
-import androidx.lifecycle.ViewModelProvider
 import com.drake.brv.BindingAdapter
-import com.drake.brv.annotaion.ItemOrientation
 import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
-import com.grkj.data.enums.LockModeEnum
-import com.grkj.data.enums.LockStepEnum
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentHomeBinding
-import com.grkj.iscs.databinding.ItemHomeMenuBinding
 import com.grkj.iscs.databinding.ItemHomeQuickEntranceBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
 import com.grkj.iscs.features.main.entity.MenuItemEntity
 import com.grkj.iscs.features.main.viewmodel.home.HomeViewModel
-import com.grkj.iscs.utils.getLockModeStr
-import com.grkj.iscs.utils.getLockModeType
 import com.grkj.ui_base.base.BaseFragment
 import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.event.BottomNavVisibilityEvent
@@ -197,28 +189,30 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
     }
 
     private fun setLockModeData() {
-        TextDropDownDialog.showSingle(
-            LockModeEnum.values().map {
-                TextDropDownDialog.SimpleTextDropDownEntity(
-                    dataTag = it.getLockModeType(),
-                    dataText = it.getLockModeStr()
-                )
-            }.toMutableList().apply {
-                add(
-                    0, TextDropDownDialog.SimpleTextDropDownEntity(
-                        dataId = 0,
-                        dataText = getString(R.string.all)
+        viewModel.getWorkflowMode().observe(this) { workflowModes ->
+            TextDropDownDialog.showSingle(
+                workflowModes.map {
+                    TextDropDownDialog.SimpleTextDropDownEntity(
+                        dataId = it.modeId,
+                        dataText = it.modeTitle.toString()
                     )
-                )
-            }, binding.lockMode
-        ) {
-            binding.lockMode.text = it.getShowText()
-            if (it.getShowText() == getString(R.string.all)) {
-                viewModel.selectedLockMode = ""
-            } else {
-                viewModel.selectedLockMode = it.getTag()
+                }.toMutableList().apply {
+                    add(
+                        0, TextDropDownDialog.SimpleTextDropDownEntity(
+                            dataId = 0,
+                            dataText = getString(R.string.all)
+                        )
+                    )
+                }, binding.lockMode
+            ) {
+                binding.lockMode.text = it.getShowText()
+                if (it.getShowText() == getString(R.string.all)) {
+                    viewModel.selectedWorkflowMode = null
+                } else {
+                    viewModel.selectedWorkflowMode = it.getId()
+                }
+                getHomeData()
             }
-            getHomeData()
         }
     }
 

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

@@ -1,6 +1,5 @@
 package com.grkj.iscs.features.main.fragment.job_manage
 
-import android.view.View
 import android.widget.LinearLayout
 import androidx.core.view.isVisible
 import androidx.fragment.app.viewModels
@@ -9,19 +8,17 @@ import com.drake.brv.utils.grid
 import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
-import com.grkj.data.enums.LockModeEnum
-import com.grkj.data.enums.LockStepEnum
+import com.grkj.data.model.dos.WorkflowStep
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.common.DataTransferConstants
 import com.grkj.iscs.databinding.FragmentCreateJobBinding
+import com.grkj.iscs.databinding.ItemJobWorkflowStepBinding
 import com.grkj.iscs.databinding.ItemSelectMemberBinding
 import com.grkj.iscs.databinding.ItemSelectPointBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
 import com.grkj.iscs.features.main.viewmodel.job_manage.JobViewModel
-import com.grkj.iscs.utils.getLockModeStr
-import com.grkj.iscs.utils.getLockModeType
 import com.grkj.ui_base.base.BaseFormFragment
 import com.grkj.ui_base.dialog.TipDialog
 import com.grkj.ui_base.utils.CommonUtils
@@ -39,7 +36,7 @@ import kotlin.coroutines.suspendCoroutine
 @AndroidEntryPoint
 class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
     private val viewModel: JobViewModel by viewModels()
-    private var selectedLockMode: String? = null
+    private var selectedModeId: Long? = null
     private var selectedWorkstationId: Long? = null
     private var selectedPointData: List<PointManageVo> = mutableListOf()
     private var selectedLockerData: List<UserManageVo> = mutableListOf()
@@ -53,7 +50,7 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
             binding.jobNameEt,
             binding.workstationTv,
             binding.lockModeTv,
-            selectedLockMode,
+            selectedModeId,
             selectedWorkstationId,
             selectedPointData,
             selectedLockerData,
@@ -93,7 +90,9 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
                             } else {
                                 null
                             }
-                            createJob(sopId)
+                            ThreadUtils.runOnMain {
+                                createJob(sopId)
+                            }
                         }
                     })
             }
@@ -115,7 +114,9 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
                             } else {
                                 null
                             }
-                            createJob(sopId, true)
+                            ThreadUtils.runOnMain {
+                                createJob(sopId, true)
+                            }
                         }
                     })
             }
@@ -124,7 +125,7 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
             setWorkstationData()
         }
         binding.lockModeTv.setOnClickListener {
-            setLockModeData()
+            setWorkflowModeData()
         }
         binding.noSelectedPointLayout.setDebouncedClickListener {
             if (selectedWorkstationId == null) {
@@ -155,14 +156,13 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
                 PopTip.tip(R.string.please_select_job_workstation)
                 return@setDebouncedClickListener
             }
-            if (selectedLockMode == null) {
+            if (selectedModeId == null) {
                 PopTip.tip(R.string.please_select_flow_mode)
                 return@setDebouncedClickListener
             }
             GlobalDataTempStore.getInstance().saveData(
-                DataTransferConstants.KEY_CAN_SELECT_COLOCKER, selectedLockMode?.contains(
-                    LockStepEnum.COLOCK.type.toString()
-                ) == true
+                DataTransferConstants.KEY_CAN_SELECT_COLOCKER,
+                viewModel.workflowModes.find { it.modeId == selectedModeId }?.isColockSupport == true
             )
             GlobalDataTempStore.getInstance()
                 .saveData(
@@ -170,7 +170,10 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
                     selectedWorkstationId!!
                 )
             GlobalDataTempStore.getInstance()
-                .saveData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA, selectedLockerData)
+                .saveData(
+                    DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA,
+                    selectedLockerData
+                )
             GlobalDataTempStore.getInstance()
                 .saveData(
                     DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA,
@@ -221,14 +224,14 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
                 PopTip.tip(R.string.please_select_job_workstation)
                 return@setDebouncedClickListener
             }
-            if (selectedLockMode == null) {
+            if (selectedModeId == null) {
                 PopTip.tip(R.string.please_select_flow_mode)
                 return@setDebouncedClickListener
             }
+
             GlobalDataTempStore.getInstance().saveData(
-                DataTransferConstants.KEY_CAN_SELECT_COLOCKER, selectedLockMode?.contains(
-                    LockStepEnum.COLOCK.type.toString()
-                ) == true
+                DataTransferConstants.KEY_CAN_SELECT_COLOCKER,
+                viewModel.workflowModes.find { it.modeId == selectedModeId }?.isColockSupport == true
             )
             GlobalDataTempStore.getInstance()
                 .saveData(
@@ -236,7 +239,10 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
                     selectedWorkstationId!!
                 )
             GlobalDataTempStore.getInstance()
-                .saveData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA, selectedLockerData)
+                .saveData(
+                    DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA,
+                    selectedLockerData
+                )
             GlobalDataTempStore.getInstance()
                 .saveData(
                     DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA,
@@ -266,6 +272,28 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
                 onSelectedMemberRVBinding(this)
             }
         }
+        binding.workflowRv.linear(LinearLayout.HORIZONTAL).setup {
+            addType<WorkflowStep>(R.layout.item_job_workflow_step)
+            onBind {
+                onWorkflowStepBinding(this)
+            }
+        }
+    }
+
+    /**
+     * 流程模式绑定
+     */
+    private fun onWorkflowStepBinding(holder: BindingAdapter.BindingViewHolder) {
+        val itemBinding = holder.getBinding<ItemJobWorkflowStepBinding>()
+        val item = holder.getModel<WorkflowStep>()
+        itemBinding.stepNameTv.text = item.stepTitleShort
+        itemBinding.stepIndexTv.text = item.stepIndex.toString()
+        itemBinding.dividerIv.isVisible = item.stepIndex != viewModel.workflowSteps.last().stepIndex
+    }
+
+    override fun initData() {
+        super.initData()
+        viewModel.getWorkflowModes().observe(this) {}
     }
 
     /**
@@ -278,7 +306,7 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
                     selectedPointData,
                     selectedLockerData,
                     selectedColockerData,
-                    selectedLockMode,
+                    selectedModeId!!,
                     selectedWorkstationId!!,
                     binding.jobNameEt.text.toString()
                 ).observe(this@CreateJobFragment) {
@@ -297,7 +325,7 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
             selectedPointData,
             selectedLockerData,
             selectedColockerData,
-            selectedLockMode,
+            selectedModeId!!,
             sopId,
             selectedWorkstationId!!,
             binding.jobNameEt.text.toString()
@@ -364,7 +392,7 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
         selectedLockerData = listOf()
         selectedColockerData = listOf()
         selectedPointData = listOf()
-        selectedLockMode = null
+        selectedModeId = null
         selectedWorkstationId = null
         binding.saveSop.isChecked = false
         binding.lockModeTv.text = ""
@@ -381,7 +409,7 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
             PopTip.tip(R.string.please_select_job_workstation)
             return false
         }
-        if (selectedLockMode == null) {
+        if (selectedModeId == null) {
             PopTip.tip(R.string.please_select_flow_mode)
             return false
         }
@@ -397,9 +425,7 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
             PopTip.tip(com.grkj.ui_base.R.string.select_locker)
             return false
         }
-        if (selectedLockMode?.contains(
-                LockStepEnum.COLOCK.type.toString()
-            ) == true && selectedColockerData.isEmpty()
+        if (viewModel.workflowModes.find { it.modeId == selectedModeId }?.isColockSupport == true && selectedColockerData.isEmpty()
         ) {
             PopTip.tip(com.grkj.ui_base.R.string.select_coloker)
             return false
@@ -477,20 +503,23 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
         }
     }
 
-    private fun setLockModeData() {
+    private fun setWorkflowModeData() {
         TextDropDownDialog.showSingle(
-            LockModeEnum.values().map {
+            viewModel.workflowModes.map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
-                    dataTag = it.getLockModeType(),
-                    dataText = it.getLockModeStr()
+                    dataId = it.modeId,
+                    dataText = it.modeTitle.toString()
                 )
             }, binding.lockModeTv
         ) {
             binding.lockModeTv.text = it.getShowText()
-            selectedLockMode = it.getTag()
-            binding.selectColockerLayout.isVisible = selectedLockMode?.contains(
-                LockStepEnum.COLOCK.type.toString()
-            ) == true
+            selectedModeId = it.getId()
+            viewModel.getWorkflowSteps(selectedModeId!!).observe(this) {
+                binding.workflowRv.models = viewModel.workflowSteps
+                binding.selectWorkflowTip.isVisible = false
+            }
+            binding.selectColockerLayout.isVisible =
+                viewModel.workflowModes.find { it.modeId == selectedModeId }?.isColockSupport == true
         }
     }
 }

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

@@ -1,6 +1,5 @@
 package com.grkj.iscs.features.main.fragment.job_manage
 
-import android.view.View
 import android.widget.LinearLayout
 import androidx.core.view.isVisible
 import androidx.fragment.app.viewModels
@@ -9,21 +8,18 @@ import com.drake.brv.utils.grid
 import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
-import com.grkj.data.enums.LockModeEnum
-import com.grkj.data.enums.LockStepEnum
+import com.grkj.data.model.dos.WorkflowStep
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.common.DataTransferConstants
 import com.grkj.iscs.databinding.FragmentCreateSopBinding
+import com.grkj.iscs.databinding.ItemJobWorkflowStepBinding
 import com.grkj.iscs.databinding.ItemSelectMemberBinding
 import com.grkj.iscs.databinding.ItemSelectPointBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
 import com.grkj.iscs.features.main.viewmodel.job_manage.SopViewModel
-import com.grkj.iscs.utils.getLockModeStr
-import com.grkj.iscs.utils.getLockModeType
 import com.grkj.ui_base.base.BaseFormFragment
-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
@@ -37,7 +33,7 @@ import dagger.hilt.android.AndroidEntryPoint
 @AndroidEntryPoint
 class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
     private val viewModel: SopViewModel by viewModels()
-    private var selectedLockMode: String? = null
+    private var selectedModeId: Long? = null
     private var selectedWorkstationId: Long? = null
     private var selectedPointData: List<PointManageVo> = mutableListOf()
     private var selectedLockerData: List<UserManageVo> = mutableListOf()
@@ -51,7 +47,7 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
             binding.sopNameEt,
             binding.workstationTv,
             binding.lockModeTv,
-            selectedLockMode,
+            selectedModeId,
             selectedWorkstationId,
             selectedPointData,
             selectedLockerData,
@@ -124,14 +120,13 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
                 PopTip.tip(R.string.please_select_sop_workstation)
                 return@setDebouncedClickListener
             }
-            if (selectedLockMode == null) {
+            if (selectedModeId == null) {
                 PopTip.tip(R.string.please_select_flow_mode)
                 return@setDebouncedClickListener
             }
             GlobalDataTempStore.getInstance().saveData(
-                DataTransferConstants.KEY_CAN_SELECT_COLOCKER, selectedLockMode?.contains(
-                    LockStepEnum.COLOCK.type.toString()
-                ) == true
+                DataTransferConstants.KEY_CAN_SELECT_COLOCKER,
+                viewModel.workflowModes.find { it.modeId == selectedModeId }?.isColockSupport == true
             )
             GlobalDataTempStore.getInstance()
                 .saveData(
@@ -190,14 +185,13 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
                 PopTip.tip(R.string.please_select_sop_workstation)
                 return@setDebouncedClickListener
             }
-            if (selectedLockMode == null) {
+            if (selectedModeId == null) {
                 PopTip.tip(R.string.please_select_flow_mode)
                 return@setDebouncedClickListener
             }
             GlobalDataTempStore.getInstance().saveData(
-                DataTransferConstants.KEY_CAN_SELECT_COLOCKER, selectedLockMode?.contains(
-                    LockStepEnum.COLOCK.type.toString()
-                ) == true
+                DataTransferConstants.KEY_CAN_SELECT_COLOCKER,
+                viewModel.workflowModes.find { it.modeId == selectedModeId }?.isColockSupport == true
             )
             GlobalDataTempStore.getInstance()
                 .saveData(
@@ -235,6 +229,28 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
                 onSelectedMemberRVBinding(this)
             }
         }
+        binding.workflowRv.linear(LinearLayout.HORIZONTAL).setup {
+            addType<WorkflowStep>(R.layout.item_job_workflow_step)
+            onBind {
+                onWorkflowStepBinding(this)
+            }
+        }
+    }
+
+    /**
+     * 流程模式绑定
+     */
+    private fun onWorkflowStepBinding(holder: BindingAdapter.BindingViewHolder) {
+        val itemBinding = holder.getBinding<ItemJobWorkflowStepBinding>()
+        val item = holder.getModel<WorkflowStep>()
+        itemBinding.stepNameTv.text = item.stepTitleShort
+        itemBinding.stepIndexTv.text = item.stepIndex.toString()
+        itemBinding.dividerIv.isVisible = item.stepIndex != viewModel.workflowSteps.last().stepIndex
+    }
+
+    override fun initData() {
+        super.initData()
+        viewModel.getWorkflowModes().observe(this) {}
     }
 
     /**
@@ -245,7 +261,7 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
             selectedPointData,
             selectedLockerData,
             selectedColockerData,
-            selectedLockMode,
+            selectedModeId!!,
             selectedWorkstationId!!,
             binding.sopNameEt.text.toString()
         ).observe(this) {
@@ -279,7 +295,7 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
         selectedLockerData = listOf()
         selectedColockerData = listOf()
         selectedPointData = listOf()
-        selectedLockMode = null
+        selectedModeId = null
         selectedWorkstationId = null
         binding.lockModeTv.text = ""
         binding.workstationTv.text = ""
@@ -296,7 +312,7 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
             PopTip.tip(R.string.please_select_sop_workstation)
             return false
         }
-        if (selectedLockMode == null) {
+        if (selectedModeId == null) {
             PopTip.tip(R.string.please_select_flow_mode)
             return false
         }
@@ -312,9 +328,7 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
             PopTip.tip(com.grkj.ui_base.R.string.select_locker)
             return false
         }
-        if (selectedLockMode?.contains(
-                LockStepEnum.COLOCK.type.toString()
-            ) == true && selectedColockerData.isEmpty()
+        if (viewModel.workflowModes.find { it.modeId == selectedModeId }?.isColockSupport == true && selectedColockerData.isEmpty()
         ) {
             PopTip.tip(com.grkj.ui_base.R.string.select_coloker)
             return false
@@ -394,18 +408,21 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
 
     private fun setLockModeData() {
         TextDropDownDialog.showSingle(
-            LockModeEnum.values().map {
+            viewModel.workflowModes.map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
-                    dataTag = it.getLockModeType(),
-                    dataText = it.getLockModeStr()
+                    dataId = it.modeId,
+                    dataText = it.modeTitle.toString()
                 )
             }, binding.lockModeTv
         ) {
             binding.lockModeTv.text = it.getShowText()
-            selectedLockMode = it.getTag()
-            binding.selectColockerLayout.isVisible = selectedLockMode?.contains(
-                LockStepEnum.COLOCK.type.toString()
-            ) == true
+            selectedModeId = it.getId()
+            viewModel.getWorkflowSteps(selectedModeId!!).observe(this) {
+                binding.workflowRv.models = viewModel.workflowSteps
+                binding.selectWorkflowTip.isVisible = false
+            }
+            binding.selectColockerLayout.isVisible =
+                viewModel.workflowModes.find { it.modeId == selectedModeId }?.isColockSupport == true
         }
     }
 }

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

@@ -9,13 +9,14 @@ import com.drake.brv.utils.grid
 import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
-import com.grkj.data.enums.LockStepEnum
+import com.grkj.data.model.dos.WorkflowStep
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.SopManageVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.common.DataTransferConstants
 import com.grkj.iscs.databinding.FragmentCreateSopJobBinding
+import com.grkj.iscs.databinding.ItemJobWorkflowStepBinding
 import com.grkj.iscs.databinding.ItemSelectMemberBinding
 import com.grkj.iscs.databinding.ItemSelectPointBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
@@ -62,16 +63,16 @@ class CreateSopJobFragment : BaseFormFragment<FragmentCreateSopJobBinding>() {
 
     override fun initView() {
         binding.back.setDebouncedClickListener {
-            if (isFormDirty){
+            if (isFormDirty) {
                 showUnsavedConfirmDialog()
-            }else{
+            } else {
                 navController.popBackStack()
             }
         }
         binding.cancel.setDebouncedClickListener {
-            if (isFormDirty){
+            if (isFormDirty) {
                 showUnsavedConfirmDialog()
-            }else{
+            } else {
                 navController.popBackStack()
             }
         }
@@ -124,9 +125,8 @@ class CreateSopJobFragment : BaseFormFragment<FragmentCreateSopJobBinding>() {
                 return@setDebouncedClickListener
             }
             GlobalDataTempStore.getInstance().saveData(
-                DataTransferConstants.KEY_CAN_SELECT_COLOCKER, selectedSop?.lockMode?.contains(
-                    LockStepEnum.COLOCK.type.toString()
-                ) == true
+                DataTransferConstants.KEY_CAN_SELECT_COLOCKER,
+                viewModel.workflowModes.find { it.modeId == selectedSop?.modeId }?.isColockSupport == true
             )
             GlobalDataTempStore.getInstance()
                 .saveData(
@@ -164,11 +164,30 @@ class CreateSopJobFragment : BaseFormFragment<FragmentCreateSopJobBinding>() {
                 onSelectedMemberRVBinding(this)
             }
         }
+        binding.workflowRv.linear(LinearLayout.HORIZONTAL).setup {
+            addType<WorkflowStep>(R.layout.item_job_workflow_step)
+            onBind {
+                onWorkflowStepBinding(this)
+            }
+        }
     }
 
     /**
-     * 保存sop作业
+     * 流程模式绑定
      */
+    private fun onWorkflowStepBinding(holder: BindingAdapter.BindingViewHolder) {
+        val itemBinding = holder.getBinding<ItemJobWorkflowStepBinding>()
+        val item = holder.getModel<WorkflowStep>()
+        itemBinding.stepNameTv.text = item.stepTitleShort
+        itemBinding.stepIndexTv.text = item.stepIndex.toString()
+        itemBinding.dividerIv.isVisible = item.stepIndex != viewModel.workflowSteps.last().stepIndex
+    }
+
+    override fun initData() {
+        super.initData()
+        viewModel.getWorkflowModes().observe(this) {}
+    }
+
     /**
      * 保存sop作业
      */
@@ -177,7 +196,7 @@ class CreateSopJobFragment : BaseFormFragment<FragmentCreateSopJobBinding>() {
             selectedPointData,
             selectedLockerData,
             selectedColockerData,
-            selectedSop?.lockMode,
+            selectedSop?.modeId!!,
             selectedSopId,
             selectedWorkstationId!!,
             binding.jobNameEt.text.toString()
@@ -258,9 +277,8 @@ class CreateSopJobFragment : BaseFormFragment<FragmentCreateSopJobBinding>() {
             PopTip.tip(com.grkj.ui_base.R.string.select_locker)
             return false
         }
-        if (selectedSop?.lockMode?.contains(
-                LockStepEnum.COLOCK.type.toString()
-            ) == true && selectedColockerData.isEmpty()
+        if (viewModel.workflowModes.find { it.modeId == selectedSop?.modeId }?.isColockSupport == true &&
+            selectedColockerData.isEmpty()
         ) {
             PopTip.tip(com.grkj.ui_base.R.string.select_coloker)
             return false
@@ -325,7 +343,8 @@ class CreateSopJobFragment : BaseFormFragment<FragmentCreateSopJobBinding>() {
                         dataId = it.workstationId,
                         dataText = it.workstationName
                     )
-                },binding.workstationTv) {
+                }, binding.workstationTv
+            ) {
                 binding.workstationTv.text = it.getShowText()
                 selectedWorkstationId = it.getId()
             }
@@ -343,14 +362,18 @@ class CreateSopJobFragment : BaseFormFragment<FragmentCreateSopJobBinding>() {
                     dataObject = it,
                     dataText = it.sopName ?: ""
                 )
-            },binding.sopTv) {
+            }, binding.sopTv
+        ) {
             binding.sopTv.text = it.getShowText()
             selectedSopId = it.getId()
             selectedSop = it.getData() as SopManageVo
-            binding.selectColockerLayout.isVisible = selectedSop?.lockMode?.contains(
-                LockStepEnum.COLOCK.type.toString()
-            ) == true
-            loadSopData(it.getId())
+            viewModel.getWorkflowSteps(selectedSop?.modeId!!).observe(this) {
+                binding.workflowRv.models = viewModel.workflowSteps
+                binding.selectWorkflowTip.isVisible = false
+            }
+            binding.selectColockerLayout.isVisible =
+                viewModel.workflowModes.find { it.modeId == selectedSop?.modeId }?.isColockSupport == true
+            loadSopData(it.getId()!!)
         }
     }
 

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

@@ -1,6 +1,5 @@
 package com.grkj.iscs.features.main.fragment.job_manage
 
-import android.view.View
 import android.widget.LinearLayout
 import androidx.core.view.isVisible
 import androidx.fragment.app.viewModels
@@ -9,28 +8,24 @@ import com.drake.brv.utils.grid
 import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
-import com.grkj.data.enums.LockModeEnum
-import com.grkj.data.enums.LockStepEnum
+import com.grkj.data.model.dos.WorkflowStep
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.common.DataTransferConstants
 import com.grkj.iscs.databinding.FragmentEditJobBinding
+import com.grkj.iscs.databinding.ItemJobWorkflowStepBinding
 import com.grkj.iscs.databinding.ItemSelectMemberBinding
 import com.grkj.iscs.databinding.ItemSelectPointBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
 import com.grkj.iscs.features.main.viewmodel.job_manage.JobViewModel
-import com.grkj.iscs.utils.getLockModeStr
-import com.grkj.iscs.utils.getLockModeType
 import com.grkj.ui_base.base.BaseFormFragment
-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.data.GlobalDataTempStore
 import com.sik.sikcore.extension.setDebouncedClickListener
 import dagger.hilt.android.AndroidEntryPoint
-import kotlin.getValue
 
 /**
  * 编辑作业
@@ -38,7 +33,7 @@ import kotlin.getValue
 @AndroidEntryPoint
 class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
     private val viewModel: JobViewModel by viewModels()
-    private var selectedLockMode: String? = null
+    private var selectedModeId: Long? = null
     private var selectedWorkstationId: Long? = null
     private var selectedPointData: List<PointManageVo> = mutableListOf()
     private var selectedLockerData: List<UserManageVo> = mutableListOf()
@@ -47,10 +42,13 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
         return R.layout.fragment_edit_job
     }
 
+    override val needInitData: Boolean
+        get() = true
+
     override val needWatchObject: List<Any?> by lazy {
         listOf(
             binding.jobNameEt, binding.workstationTv, binding.lockModeTv,
-            selectedLockMode,
+            selectedModeId,
             selectedWorkstationId,
             selectedPointData,
             selectedLockerData,
@@ -134,14 +132,13 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
                 PopTip.tip(R.string.please_select_job_workstation)
                 return@setDebouncedClickListener
             }
-            if (selectedLockMode == null) {
+            if (selectedModeId == null) {
                 PopTip.tip(R.string.please_select_flow_mode)
                 return@setDebouncedClickListener
             }
             GlobalDataTempStore.getInstance().saveData(
-                DataTransferConstants.KEY_CAN_SELECT_COLOCKER, selectedLockMode?.contains(
-                    LockStepEnum.COLOCK.type.toString()
-                ) == true
+                DataTransferConstants.KEY_CAN_SELECT_COLOCKER,
+                viewModel.workflowModes.find { it.modeId == selectedModeId }?.isColockSupport == true
             )
             GlobalDataTempStore.getInstance().saveData(
                 DataTransferConstants.KEY_SELECT_POINT_WORKSTATION_ID, selectedWorkstationId!!
@@ -173,6 +170,23 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
                 onSelectedMemberRVBinding(this)
             }
         }
+        binding.workflowRv.linear(LinearLayout.HORIZONTAL).setup {
+            addType<WorkflowStep>(R.layout.item_job_workflow_step)
+            onBind {
+                onWorkflowStepBinding(this)
+            }
+        }
+    }
+
+    /**
+     * 流程模式绑定
+     */
+    private fun onWorkflowStepBinding(holder: BindingAdapter.BindingViewHolder) {
+        val itemBinding = holder.getBinding<ItemJobWorkflowStepBinding>()
+        val item = holder.getModel<WorkflowStep>()
+        itemBinding.stepNameTv.text = item.stepTitleShort
+        itemBinding.stepIndexTv.text = item.stepIndex.toString()
+        itemBinding.dividerIv.isVisible = item.stepIndex != viewModel.workflowSteps.last().stepIndex
     }
 
     /**
@@ -183,7 +197,7 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
             selectedPointData,
             selectedLockerData,
             selectedColockerData,
-            selectedLockMode,
+            selectedModeId!!,
             sopId,
             selectedWorkstationId!!,
             binding.jobNameEt.text.toString(),
@@ -252,7 +266,7 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
             PopTip.tip(R.string.please_select_job_workstation)
             return false
         }
-        if (selectedLockMode == null) {
+        if (selectedModeId == null) {
             PopTip.tip(R.string.please_select_flow_mode)
             return false
         }
@@ -268,9 +282,8 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
             PopTip.tip(com.grkj.ui_base.R.string.select_locker)
             return false
         }
-        if (selectedLockMode?.contains(
-                LockStepEnum.COLOCK.type.toString()
-            ) == true && selectedColockerData.isEmpty()
+        if (viewModel.workflowModes.find { it.modeId == selectedModeId }?.isColockSupport == true &&
+            selectedColockerData.isEmpty()
         ) {
             PopTip.tip(com.grkj.ui_base.R.string.select_coloker)
             return false
@@ -296,25 +309,31 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
         super.initData()
         val ticketId = GlobalDataTempStore.getInstance()
             .getData(DataTransferConstants.KEY_JOB_TICKET_ID) as Long
-        viewModel.getJobData(ticketId).observe(this) {
-            binding.workstationTv.text =
-                viewModel.workstationData.find { it.workstationId == viewModel.jobTicketData?.workstationId }?.workstationName
-            selectedWorkstationId = viewModel.jobTicketData?.workstationId
-            selectedLockMode = viewModel.jobTicketData?.lockMode
-            binding.lockModeTv.text =
-                LockModeEnum.values().find { it.getLockModeType() == selectedLockMode }
-                    ?.getLockModeStr()
-            binding.jobNameEt.setText(viewModel.jobTicketData?.ticketName)
-            selectedPointData = viewModel.jobPointsData
-            selectedLockerData = viewModel.jobLockerData
-            selectedColockerData = viewModel.jobColockerData
-            binding.pointRv.models = viewModel.jobPointsData
-            viewModel.jobLockerData.firstOrNull()?.let {
-                binding.lockerName.text = it.nickName
+        viewModel.getWorkflowModes().observe(this) {
+            viewModel.getJobData(ticketId).observe(this) {
+                binding.workstationTv.text =
+                    viewModel.workstationData.find { it.workstationId == viewModel.jobTicketData?.workstationId }?.workstationName
+                selectedWorkstationId = viewModel.jobTicketData?.workstationId
+                selectedModeId = viewModel.jobTicketData?.modeId
+                binding.lockModeTv.text =
+                    viewModel.workflowModes.find { it.modeId == selectedModeId }
+                        ?.modeTitle
+                binding.jobNameEt.setText(viewModel.jobTicketData?.ticketName)
+                selectedPointData = viewModel.jobPointsData
+                selectedLockerData = viewModel.jobLockerData
+                selectedColockerData = viewModel.jobColockerData
+                binding.pointRv.models = viewModel.jobPointsData
+                viewModel.jobLockerData.firstOrNull()?.let {
+                    binding.lockerName.text = it.nickName
+                }
+                binding.colockerRv.models = viewModel.jobColockerData
+                binding.selectColockerLayout.isVisible =
+                    viewModel.workflowModes.find { it.modeId == selectedModeId }?.isColockSupport == true
+                viewModel.getWorkflowSteps(selectedModeId!!).observe(this) {
+                    binding.workflowRv.models = viewModel.workflowSteps
+                }
+                initDataComplete()
             }
-            binding.colockerRv.models = viewModel.jobColockerData
-            binding.selectColockerLayout.isVisible =
-                selectedLockMode?.contains(LockStepEnum.COLOCK.type.toString()) == true
         }
     }
 
@@ -372,17 +391,19 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
 
     private fun setLockModeData() {
         TextDropDownDialog.showSingle(
-            LockModeEnum.values().map {
+            viewModel.workflowModes.map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
-                    dataTag = it.getLockModeType(), dataText = it.getLockModeStr()
+                    dataId = it.modeId, dataText = it.modeTitle.toString()
                 )
             }, binding.lockModeTv
         ) {
             binding.lockModeTv.text = it.getShowText()
-            selectedLockMode = it.getTag()
-            binding.selectColockerLayout.isVisible = selectedLockMode?.contains(
-                LockStepEnum.COLOCK.type.toString()
-            ) == true
+            selectedModeId = it.getId()
+            viewModel.getWorkflowSteps(selectedModeId!!).observe(this) {
+                binding.workflowRv.models = viewModel.workflowSteps
+            }
+            binding.selectColockerLayout.isVisible =
+                viewModel.workflowModes.find { it.modeId == selectedModeId }?.isColockSupport == true
         }
     }
 }

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

@@ -1,6 +1,5 @@
 package com.grkj.iscs.features.main.fragment.job_manage
 
-import android.view.View
 import android.widget.LinearLayout
 import androidx.core.view.isVisible
 import androidx.fragment.app.viewModels
@@ -9,20 +8,18 @@ import com.drake.brv.utils.grid
 import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
-import com.grkj.data.enums.LockModeEnum
-import com.grkj.data.enums.LockStepEnum
 import com.grkj.data.enums.RoleEnum
+import com.grkj.data.model.dos.WorkflowStep
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.common.DataTransferConstants
 import com.grkj.iscs.databinding.FragmentEditSopBinding
+import com.grkj.iscs.databinding.ItemJobWorkflowStepBinding
 import com.grkj.iscs.databinding.ItemSelectMemberBinding
 import com.grkj.iscs.databinding.ItemSelectPointBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
 import com.grkj.iscs.features.main.viewmodel.job_manage.SopViewModel
-import com.grkj.iscs.utils.getLockModeStr
-import com.grkj.iscs.utils.getLockModeType
 import com.grkj.ui_base.base.BaseFormFragment
 import com.grkj.ui_base.dialog.TipDialog
 import com.grkj.ui_base.utils.CommonUtils
@@ -37,7 +34,7 @@ import dagger.hilt.android.AndroidEntryPoint
 @AndroidEntryPoint
 class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
     private val viewModel: SopViewModel by viewModels()
-    private var selectedLockMode: String? = null
+    private var selectedModeId: Long? = null
     private var selectedWorkstationId: Long? = null
     private var selectedPointData: List<PointManageVo> = mutableListOf()
     private var selectedLockerData: List<UserManageVo> = mutableListOf()
@@ -46,12 +43,15 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
         return R.layout.fragment_edit_sop
     }
 
+    override val needInitData: Boolean
+        get() = true
+
     override val needWatchObject: List<Any?> by lazy {
         listOf(
             binding.sopNameEt,
             binding.workstationTv,
             binding.lockModeTv,
-            selectedLockMode,
+            selectedModeId,
             selectedWorkstationId,
             selectedPointData,
             selectedLockerData,
@@ -124,14 +124,13 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
                 PopTip.tip(R.string.please_select_sop_workstation)
                 return@setDebouncedClickListener
             }
-            if (selectedLockMode == null) {
+            if (selectedModeId == null) {
                 PopTip.tip(R.string.please_select_flow_mode)
                 return@setDebouncedClickListener
             }
             GlobalDataTempStore.getInstance().saveData(
-                DataTransferConstants.KEY_CAN_SELECT_COLOCKER, selectedLockMode?.contains(
-                    LockStepEnum.COLOCK.type.toString()
-                ) == true
+                DataTransferConstants.KEY_CAN_SELECT_COLOCKER,
+                viewModel.workflowModes.find { it.modeId == selectedModeId }?.isColockSupport == true
             )
             GlobalDataTempStore.getInstance()
                 .saveData(
@@ -169,6 +168,23 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
                 onSelectedMemberRVBinding(this)
             }
         }
+        binding.workflowRv.linear(LinearLayout.HORIZONTAL).setup {
+            addType<WorkflowStep>(R.layout.item_job_workflow_step)
+            onBind {
+                onWorkflowStepBinding(this)
+            }
+        }
+    }
+
+    /**
+     * 流程模式绑定
+     */
+    private fun onWorkflowStepBinding(holder: BindingAdapter.BindingViewHolder) {
+        val itemBinding = holder.getBinding<ItemJobWorkflowStepBinding>()
+        val item = holder.getModel<WorkflowStep>()
+        itemBinding.stepNameTv.text = item.stepTitleShort
+        itemBinding.stepIndexTv.text = item.stepIndex.toString()
+        itemBinding.dividerIv.isVisible = item.stepIndex != viewModel.workflowSteps.last().stepIndex
     }
 
     /**
@@ -179,7 +195,7 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
             selectedPointData,
             selectedLockerData,
             selectedColockerData,
-            selectedLockMode,
+            selectedModeId!!,
             selectedWorkstationId!!,
             binding.sopNameEt.text.toString(),
             viewModel.selectedSopData?.sopId ?: 0
@@ -217,7 +233,7 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
             PopTip.tip(R.string.please_select_sop_workstation)
             return false
         }
-        if (selectedLockMode == null) {
+        if (selectedModeId == null) {
             PopTip.tip(R.string.please_select_flow_mode)
             return false
         }
@@ -233,9 +249,7 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
             PopTip.tip(com.grkj.ui_base.R.string.select_locker)
             return false
         }
-        if (selectedLockMode?.contains(
-                LockStepEnum.COLOCK.type.toString()
-            ) == true && selectedColockerData.isEmpty()
+        if (viewModel.workflowModes.find { it.modeId == selectedModeId }?.isColockSupport == true && selectedColockerData.isEmpty()
         ) {
             PopTip.tip(com.grkj.ui_base.R.string.select_coloker)
             return false
@@ -261,29 +275,35 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
         super.initData()
         val sopId = GlobalDataTempStore.getInstance()
             .getData(DataTransferConstants.KEY_EDIT_SOP_SOP_ID) as Long
-        viewModel.getSopDataBySopId(sopId).observe(this) {
-            selectedPointData = viewModel.selectedSopPointData
-            selectedLockMode = viewModel.selectedSopData?.lockMode
-            selectedWorkstationId = viewModel.selectedSopData?.workstationId
-            binding.workstationTv.text = viewModel.selectedSopData?.workstationName
-            binding.sopNameEt.setText(viewModel.selectedSopData?.sopName)
-            binding.lockModeTv.text = LockModeEnum.values()
-                .find { it.getLockModeType() == selectedLockMode }?.description
-            selectedLockerData = viewModel.selectedSopUserData.filter {
-                it.roleKeys.contains(
-                    RoleEnum.JTLOCKER.roleKey
-                )
-            }
-            selectedColockerData = viewModel.selectedSopUserData.filter {
-                it.roleKeys.contains(
-                    RoleEnum.JTCOLOCKER.roleKey
-                )
+        viewModel.getWorkflowModes().observe(this) {
+            viewModel.getSopDataBySopId(sopId).observe(this) {
+                selectedPointData = viewModel.selectedSopPointData
+                selectedModeId = viewModel.selectedSopData?.modeId
+                selectedWorkstationId = viewModel.selectedSopData?.workstationId
+                binding.workstationTv.text = viewModel.selectedSopData?.workstationName
+                binding.sopNameEt.setText(viewModel.selectedSopData?.sopName)
+                binding.lockModeTv.text = viewModel.workflowModes
+                    .find { it.modeId == selectedModeId }?.modeTitle
+                selectedLockerData = viewModel.selectedSopUserData.filter {
+                    it.roleKeys.contains(
+                        RoleEnum.JTLOCKER.roleKey
+                    )
+                }
+                selectedColockerData = viewModel.selectedSopUserData.filter {
+                    it.roleKeys.contains(
+                        RoleEnum.JTCOLOCKER.roleKey
+                    )
+                }
+                binding.lockerName.text = selectedLockerData.first().nickName
+                binding.colockerRv.models = selectedColockerData
+                binding.pointRv.models = selectedPointData
+                binding.selectColockerLayout.isVisible =
+                    viewModel.workflowModes.find { it.modeId == selectedModeId }?.isColockSupport == true
+                viewModel.getWorkflowSteps(selectedModeId!!).observe(this) {
+                    binding.workflowRv.models = viewModel.workflowSteps
+                }
+                initDataComplete()
             }
-            binding.lockerName.text = selectedLockerData.first().nickName
-            binding.colockerRv.models = selectedColockerData
-            binding.pointRv.models = selectedPointData
-            binding.selectColockerLayout.isVisible =
-                selectedLockMode?.contains(LockStepEnum.COLOCK.type.toString()) == true
         }
     }
 
@@ -342,18 +362,20 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
 
     private fun setLockModeData() {
         TextDropDownDialog.showSingle(
-            LockModeEnum.values().map {
+            viewModel.workflowModes.map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
-                    dataTag = it.getLockModeType(),
-                    dataText = it.getLockModeStr()
+                    dataId = it.modeId,
+                    dataText = it.modeTitle.toString()
                 )
             }, binding.lockModeTv
         ) {
             binding.lockModeTv.text = it.getShowText()
-            selectedLockMode = it.getTag()
-            binding.selectColockerLayout.isVisible = selectedLockMode?.contains(
-                LockStepEnum.COLOCK.type.toString()
-            ) == true
+            selectedModeId = it.getId()
+            viewModel.getWorkflowSteps(selectedModeId!!).observe(this) {
+                binding.workflowRv.models = viewModel.workflowSteps
+            }
+            binding.selectColockerLayout.isVisible =
+                viewModel.workflowModes.find { it.modeId == selectedModeId }?.isColockSupport == true
         }
     }
 }

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

@@ -9,13 +9,14 @@ import com.drake.brv.utils.grid
 import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
-import com.grkj.data.enums.LockStepEnum
+import com.grkj.data.model.dos.WorkflowStep
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.SopManageVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.common.DataTransferConstants
 import com.grkj.iscs.databinding.FragmentEditSopJobBinding
+import com.grkj.iscs.databinding.ItemJobWorkflowStepBinding
 import com.grkj.iscs.databinding.ItemSelectMemberBinding
 import com.grkj.iscs.databinding.ItemSelectPointBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
@@ -46,6 +47,9 @@ class EditSopJobFragment : BaseFormFragment<FragmentEditSopJobBinding>() {
         return R.layout.fragment_edit_sop_job
     }
 
+    override val needInitData: Boolean
+        get() = true
+
     override val needWatchObject: List<Any?> by lazy {
         listOf(
             binding.sopTv,
@@ -124,9 +128,8 @@ class EditSopJobFragment : BaseFormFragment<FragmentEditSopJobBinding>() {
                 return@setDebouncedClickListener
             }
             GlobalDataTempStore.getInstance().saveData(
-                DataTransferConstants.KEY_CAN_SELECT_COLOCKER, selectedSop?.lockMode?.contains(
-                    LockStepEnum.COLOCK.type.toString()
-                ) == true
+                DataTransferConstants.KEY_CAN_SELECT_COLOCKER,
+                viewModel.workflowModes.find { it.modeId == selectedSop?.modeId }?.isColockSupport == true
             )
             GlobalDataTempStore.getInstance().saveData(
                 DataTransferConstants.KEY_SELECT_POINT_WORKSTATION_ID, selectedWorkstationId!!
@@ -158,6 +161,23 @@ class EditSopJobFragment : BaseFormFragment<FragmentEditSopJobBinding>() {
                 onSelectedMemberRVBinding(this)
             }
         }
+        binding.workflowRv.linear(LinearLayout.HORIZONTAL).setup {
+            addType<WorkflowStep>(R.layout.item_job_workflow_step)
+            onBind {
+                onWorkflowStepBinding(this)
+            }
+        }
+    }
+
+    /**
+     * 流程模式绑定
+     */
+    private fun onWorkflowStepBinding(holder: BindingAdapter.BindingViewHolder) {
+        val itemBinding = holder.getBinding<ItemJobWorkflowStepBinding>()
+        val item = holder.getModel<WorkflowStep>()
+        itemBinding.stepNameTv.text = item.stepTitleShort
+        itemBinding.stepIndexTv.text = item.stepIndex.toString()
+        itemBinding.dividerIv.isVisible = item.stepIndex != viewModel.workflowSteps.last().stepIndex
     }
 
     /**
@@ -168,7 +188,7 @@ class EditSopJobFragment : BaseFormFragment<FragmentEditSopJobBinding>() {
             selectedPointData,
             selectedLockerData,
             selectedColockerData,
-            selectedSop?.lockMode,
+            selectedSop?.modeId!!,
             selectedSopId,
             selectedWorkstationId!!,
             binding.jobNameEt.text.toString(),
@@ -250,9 +270,7 @@ class EditSopJobFragment : BaseFormFragment<FragmentEditSopJobBinding>() {
             PopTip.tip(com.grkj.ui_base.R.string.select_locker)
             return false
         }
-        if (selectedSop?.lockMode?.contains(
-                LockStepEnum.COLOCK.type.toString()
-            ) == true && selectedColockerData.isEmpty()
+        if (viewModel.workflowModes.find { it.modeId == selectedSop?.modeId }?.isColockSupport == true && selectedColockerData.isEmpty()
         ) {
             PopTip.tip(com.grkj.ui_base.R.string.select_coloker)
             return false
@@ -278,23 +296,30 @@ class EditSopJobFragment : BaseFormFragment<FragmentEditSopJobBinding>() {
         super.initData()
         val ticketId = GlobalDataTempStore.getInstance()
             .getData(DataTransferConstants.KEY_JOB_TICKET_ID) as Long
-        viewModel.getSopJobData(ticketId).observe(this) {
-            selectedWorkstationId = viewModel.jobTicketData?.workstationId
-            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
-            binding.sopTv.text =
-                viewModel.sopData.find { it.sopId == viewModel.jobTicketData?.sopId }?.sopName
-            binding.jobNameEt.setText(viewModel.jobTicketData?.ticketName)
-            selectedPointData = viewModel.sopPoints
-            selectedLockerData = viewModel.sopLockerData
-            selectedColockerData = viewModel.sopColockerData
-            binding.pointRv.models = selectedPointData
-            binding.lockerName.text = selectedLockerData.first().nickName
-            binding.colockerRv.models = selectedColockerData
-            binding.selectColockerLayout.isVisible =
-                selectedSop?.lockMode?.contains(LockStepEnum.COLOCK.type.toString()) == true
+        viewModel.getWorkflowModes().observe(this) {
+
+            viewModel.getSopJobData(ticketId).observe(this) {
+                selectedWorkstationId = viewModel.jobTicketData?.workstationId
+                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
+                binding.sopTv.text =
+                    viewModel.sopData.find { it.sopId == viewModel.jobTicketData?.sopId }?.sopName
+                binding.jobNameEt.setText(viewModel.jobTicketData?.ticketName)
+                selectedPointData = viewModel.sopPoints
+                selectedLockerData = viewModel.sopLockerData
+                selectedColockerData = viewModel.sopColockerData
+                binding.pointRv.models = selectedPointData
+                binding.lockerName.text = selectedLockerData.first().nickName
+                binding.colockerRv.models = selectedColockerData
+                binding.selectColockerLayout.isVisible =
+                    viewModel.workflowModes.find { it.modeId == selectedSop?.modeId }?.isColockSupport == true
+                viewModel.getWorkflowSteps(selectedSop?.modeId!!).observe(this) {
+                    binding.workflowRv.models = viewModel.workflowSteps
+                }
+                initDataComplete()
+            }
         }
     }
 
@@ -359,10 +384,12 @@ class EditSopJobFragment : BaseFormFragment<FragmentEditSopJobBinding>() {
             binding.sopTv.text = it.getShowText()
             selectedSopId = it.getId()
             selectedSop = it.getData() as SopManageVo
-            binding.selectColockerLayout.isVisible = selectedSop?.lockMode?.contains(
-                LockStepEnum.COLOCK.type.toString()
-            ) == true
-            loadSopData(it.getId())
+            viewModel.getWorkflowSteps(selectedSop?.modeId!!).observe(this) {
+                binding.workflowRv.models = viewModel.workflowSteps
+            }
+            binding.selectColockerLayout.isVisible =
+                viewModel.workflowModes.find { it.modeId == selectedSop?.modeId }?.isColockSupport == true
+            loadSopData(it.getId()!!)
         }
     }
 

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

@@ -11,7 +11,6 @@ import com.drake.brv.utils.grid
 import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
-import com.grkj.data.enums.LockStepEnum
 import com.grkj.data.enums.RoleEnum
 import com.grkj.data.model.vo.IsJobTicketPointsDataVo
 import com.grkj.data.model.vo.IsJobTicketStepDataVo
@@ -134,12 +133,14 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         }
         //临时测试
         itemBinding.stepLayout.setDebouncedClickListener {
-            if (item.stepIndex == LockStepEnum.SELECT_MEMBER.type) {
+            if (viewModel.workflowSteps.find { it.stepIndex == item.stepStatus.toInt() }?.enableSetLocker == true ||
+                viewModel.workflowSteps.find { it.stepIndex == item.stepStatus.toInt() }?.enableSetColocker == true ||
+                viewModel.workflowSteps.find { it.stepIndex == item.stepStatus.toInt() }?.enableAddColocker == true ||
+                viewModel.workflowSteps.find { it.stepIndex == item.stepStatus.toInt() }?.enableReduceColocker == true
+            ) {
                 GlobalDataTempStore.getInstance().saveData(
                     DataTransferConstants.KEY_CAN_SELECT_COLOCKER,
-                    viewModel.ticketData!!.lockMode?.contains(
-                        LockStepEnum.COLOCK.type.toString()
-                    ) == true
+                    viewModel.workflowModes.find { it.modeId == viewModel.ticketData?.modeId }?.isColockSupport == true
                 )
                 GlobalDataTempStore.getInstance()
                     .saveData(
@@ -184,11 +185,11 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
     }
 
     private fun getStepIcon(stepIndex: Int): Int {
-        return when (stepIndex) {
-            LockStepEnum.SELECT_MEMBER.type -> R.drawable.icon_select_member
-            LockStepEnum.LOCK.type -> R.drawable.icon_ticket_lock
-            LockStepEnum.COLOCK.type -> R.drawable.icon_ticket_colock
-            LockStepEnum.UNLOCK.type -> R.drawable.icon_ticket_unlock
+        return when {
+            (viewModel.workflowSteps.find { it.stepIndex == stepIndex }?.enableSetLocker == true || viewModel.workflowSteps.find { it.stepIndex == stepIndex }?.enableSetColocker == true) -> R.drawable.icon_select_member
+            viewModel.workflowSteps.find { it.stepIndex == stepIndex }?.enableLock == true -> R.drawable.icon_ticket_lock
+            viewModel.workflowSteps.find { it.stepIndex == stepIndex }?.enableColock == true -> R.drawable.icon_ticket_colock
+            viewModel.workflowSteps.find { it.stepIndex == stepIndex }?.enableUnlock == true -> R.drawable.icon_ticket_unlock
             else -> {
                 0
             }
@@ -220,7 +221,9 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
             EventConstants.EVENT_RFID_CARD_READ -> {
                 (event.data as RFIDCardReadEvent).let {
                     logger.info("读卡器获取卡片RFID:${it.rfidNo}")
-                    if (viewModel.currentStepData?.stepIndex == LockStepEnum.COLOCK.type) {
+                    if (viewModel.workflowSteps.find { it.stepIndex == viewModel.currentStepData?.stepIndex }?.enableColock == true &&
+                        viewModel.ticketPoints.none { it.pointStatus == "0" }
+                    ) {
                         viewModel.getUserIdByCardRfid(it.rfidNo).observe(this) { userId ->
                             userId?.let {
                                 val isJobCardUser =
@@ -299,20 +302,28 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         if (viewModel.currentStepData?.stepIndex == null) {
             binding.finishJob.isVisible = true
         } else {
-            when (viewModel.currentStepData?.stepIndex) {
-                LockStepEnum.SELECT_MEMBER.type -> {
+            val currentStep =
+                viewModel.workflowSteps.find { it.stepIndex == viewModel.currentStepData?.stepIndex }
+            when {
+                //步骤开启取消作业,并且点位还没有上锁,显示取消作业按钮
+                (currentStep?.enableCancelJob == true && viewModel.ticketPoints.any { it.pointStatus != "0" }) -> {
                     binding.cancelJob.isVisible = true
                 }
-
-                LockStepEnum.LOCK.type -> {
+                //步骤开启上锁,并且点位都还没有上锁
+                currentStep?.enableLock == true && viewModel.ticketPoints.any { it.pointStatus == "0" } -> {
                     binding.toLock.isVisible = true
                 }
-
-                LockStepEnum.COLOCK.type -> {
+                //步骤开启共锁,并且点位都不存在没有上锁的
+                currentStep?.enableColock == true && viewModel.ticketPoints.all { it.pointStatus != "0" } -> {
 
                 }
-
-                LockStepEnum.UNLOCK.type -> {
+                //步骤开启解锁,并且点位都已经上锁,并且如果支持共锁都已经解除
+                currentStep?.enableUnlock == true &&
+                        viewModel.ticketPoints.all { it.pointStatus == "1" } &&
+                        (viewModel.workflowModes.find { it.modeId == viewModel.ticketData?.modeId }?.isColockSupport == false ||
+                                (viewModel.workflowModes.find { it.modeId == viewModel.ticketData?.modeId }?.isColockSupport == true &&
+                                        viewModel.ticketUser.filter { it.userRole == RoleEnum.JTCOLOCKER.roleKey }
+                                            .all { it.jobStatus == "2" })) -> {
                     binding.toUnlock.isVisible = true
                 }
             }
@@ -326,25 +337,30 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
             navController.popBackStack()
             return
         }
-        viewModel.ticketId = GlobalDataTempStore.getInstance()
-            .getData(DataTransferConstants.KEY_JOB_TICKET_ID) as Long
-        getData()
+        viewModel.getWorkflowModes().observe(this) {
+            viewModel.ticketId = GlobalDataTempStore.getInstance()
+                .getData(DataTransferConstants.KEY_JOB_TICKET_ID) as Long
+            getData()
+        }
     }
 
     private fun getData() {
         viewModel.getJobTicketData().observe(this) {
             if (it) {
-                binding.jobNameTv.text = viewModel.ticketData!!.ticketName
-                binding.listRv.models = viewModel.ticketPoints
-                binding.stepRv.models = viewModel.ticketStep
-                viewModel.currentStepData =
-                    viewModel.ticketStep.firstOrNull { it.stepStatus == "0" }
-                binding.spaceView.isVisible =
-                    viewModel.ticketData!!.lockMode?.contains(LockStepEnum.COLOCK.type.toString()) == false
-                binding.colockerLayout.isVisible =
-                    viewModel.ticketData!!.lockMode?.contains(LockStepEnum.COLOCK.type.toString()) == true
-                refreshTicketUser()
-                checkCurrentStep()
+                viewModel.isUnlockFirst(viewModel.ticketData?.modeId!!).observe(this) {}
+                viewModel.getWorkflowSteps(viewModel.ticketData?.modeId!!).observe(this) {
+                    binding.jobNameTv.text = viewModel.ticketData!!.ticketName
+                    binding.listRv.models = viewModel.ticketPoints
+                    binding.stepRv.models = viewModel.ticketStep
+                    viewModel.currentStepData =
+                        viewModel.ticketStep.firstOrNull { it.stepStatus == "0" }
+                    binding.spaceView.isVisible =
+                        viewModel.workflowModes.find { it.modeId == viewModel.ticketData?.modeId }?.isColockSupport == false
+                    binding.colockerLayout.isVisible =
+                        viewModel.workflowModes.find { it.modeId == viewModel.ticketData?.modeId }?.isColockSupport == true
+                    refreshTicketUser()
+                    checkCurrentStep()
+                }
             } else {
                 TipDialog.showError(
                     msg = CommonUtils.getStr(com.grkj.ui_base.R.string.ticket_lost).toString(),

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

@@ -1,5 +1,7 @@
 package com.grkj.iscs.features.main.fragment.job_manage
 
+import androidx.annotation.OptIn
+import androidx.fragment.app.viewModels
 import com.drake.brv.BindingAdapter
 import com.drake.brv.annotaion.DividerOrientation
 import com.drake.brv.utils.dividerSpace
@@ -7,13 +9,18 @@ import com.drake.brv.utils.grid
 import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
+import com.google.android.material.badge.BadgeDrawable
+import com.google.android.material.badge.BadgeUtils
+import com.google.android.material.badge.ExperimentalBadgeUtils
 import com.grkj.data.data.MainDomainData
 import com.grkj.data.enums.RoleFunctionalPermissionsEnum
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentJobManageHomeBinding
 import com.grkj.iscs.databinding.ItemHomeMenuBinding
 import com.grkj.iscs.features.main.entity.MenuItemEntity
+import com.grkj.iscs.features.main.viewmodel.job_manage.JobManageHomeViewModel
 import com.grkj.ui_base.base.BaseFragment
+import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.event.BottomNavVisibilityEvent
 import dagger.hilt.android.AndroidEntryPoint
 
@@ -22,22 +29,23 @@ import dagger.hilt.android.AndroidEntryPoint
  */
 @AndroidEntryPoint
 class JobManageHomeFragment : BaseFragment<FragmentJobManageHomeBinding>() {
+    private val viewModel: JobManageHomeViewModel by viewModels()
     private var menuData: MutableList<MenuItemEntity> = mutableListOf(
         MenuItemEntity(
             0,
-            R.mipmap.icon_data_manage_menu_user_manage,
+            R.mipmap.icon_job_manage_in_progress_job,
             RoleFunctionalPermissionsEnum.IN_PROGRESS_JOB.description,
             RoleFunctionalPermissionsEnum.IN_PROGRESS_JOB.functionalPermission
         ),
         MenuItemEntity(
             1,
-            R.mipmap.icon_data_manage_menu_role_manage,
+            R.mipmap.icon_job_manage_create_sop,
             RoleFunctionalPermissionsEnum.CREATE_SOP.description,
             RoleFunctionalPermissionsEnum.CREATE_SOP.functionalPermission
         ),
         MenuItemEntity(
             2,
-            R.mipmap.icon_data_manage_menu_area_manage,
+            R.mipmap.icon_job_manage_sop_manage,
             RoleFunctionalPermissionsEnum.SOP_MANAGE.description,
             RoleFunctionalPermissionsEnum.SOP_MANAGE.functionalPermission
         ),
@@ -49,7 +57,7 @@ class JobManageHomeFragment : BaseFragment<FragmentJobManageHomeBinding>() {
         ),
         MenuItemEntity(
             4,
-            R.mipmap.icon_data_manage_menu_point_manage,
+            R.mipmap.icon_job_manage_create_job,
             RoleFunctionalPermissionsEnum.CREATE_JOB.description,
             RoleFunctionalPermissionsEnum.CREATE_JOB.functionalPermission
         ),
@@ -93,18 +101,29 @@ class JobManageHomeFragment : BaseFragment<FragmentJobManageHomeBinding>() {
         }
     }
 
-    override fun initData() {
-        super.initData()
-        menuData =
-            menuData.filter { MainDomainData.permissions.contains(it.permission) }.toMutableList()
-        binding.homeMenuRv.models = menuData
-    }
-
     private fun BindingAdapter.BindingViewHolder.onHomeMenuBinding(holder: BindingAdapter.BindingViewHolder) {
         val itemBinding = holder.getBinding<ItemHomeMenuBinding>()
         val item = holder.getModel<MenuItemEntity>()
         itemBinding.homeMenuIv.setImageResource(item.menuIconId)
         itemBinding.homeMenuTv.text = item.menuText
+        if (item.badgeNum != 0) {
+            if (item.badgeDrawable == null) {
+                item.badgeDrawable = BadgeDrawable.create(requireContext())
+            }
+            item.badgeDrawable?.apply {
+                badgeGravity = BadgeDrawable.TOP_END
+                number = item.badgeNum
+                backgroundColor = CommonUtils.getColor(com.grkj.ui_base.R.color.common_status_red)
+                isVisible = item.badgeNum > 0
+                itemBinding.homeMenuLayout.post {
+                    BadgeUtils.attachBadgeDrawable(
+                        this,
+                        itemBinding.homeMenuLayout,
+                        itemBinding.homeMenuLayout
+                    )
+                }
+            }
+        }
         itemBinding.root.setOnClickListener {
             onMenuClick(item.type)
         }
@@ -112,6 +131,13 @@ class JobManageHomeFragment : BaseFragment<FragmentJobManageHomeBinding>() {
 
     override fun onResume() {
         super.onResume()
+        viewModel.getInProgressJobCount().observe(this) {
+            menuData =
+                menuData.filter { MainDomainData.permissions.contains(it.permission) }
+                    .toMutableList()
+            menuData.find { it.type == 0 }?.badgeNum = it
+            binding.homeMenuRv.models = menuData
+        }
         BottomNavVisibilityEvent.sendBottomNavVisibilityEvent()
     }
 

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

@@ -76,13 +76,6 @@ class UserManageViewModel @Inject constructor(
                 workstationRepository.addUserWorkstationData(userId, it)
             }
             roleRepository.addUserRoleData(userId, userData.roleId)
-            userData.cardCode?.let {
-                hardwareRepository.addCard(
-                    userId,
-                    it,
-                    userData.nickname
-                )
-            }
             emit(true)
         }
     }

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

@@ -3,8 +3,10 @@ package com.grkj.iscs.features.main.viewmodel.home
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
 import com.grkj.data.model.dos.IsWorkstation
+import com.grkj.data.model.dos.WorkflowMode
 import com.grkj.data.repository.IHardwareRepository
 import com.grkj.data.repository.IJobTicketRepository
+import com.grkj.data.repository.IWorkflowRepository
 import com.grkj.data.repository.IWorkstationRepository
 import com.grkj.ui_base.base.BaseViewModel
 import dagger.hilt.android.lifecycle.HiltViewModel
@@ -18,7 +20,8 @@ import javax.inject.Inject
 class HomeViewModel @Inject constructor(
     val workstationRepository: IWorkstationRepository,
     val jobTicketRepository: IJobTicketRepository,
-    val hardwareRepository: IHardwareRepository
+    val hardwareRepository: IHardwareRepository,
+    val workflowRepository: IWorkflowRepository
 ) :
     BaseViewModel() {
     var workstationData: List<IsWorkstation> = listOf()
@@ -40,9 +43,9 @@ class HomeViewModel @Inject constructor(
     var overviewDataZoneId: Long? = null
 
     /**
-     * 锁定模式
+     * 流程模式
      */
-    var selectedLockMode: String = ""
+    var selectedWorkflowMode: Long? = null
 
     /**
      * 时间范围
@@ -66,9 +69,18 @@ class HomeViewModel @Inject constructor(
     fun getHomeData(): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
             inProgressJobNum =
-                jobTicketRepository.getInProgressJobSize(realTimeDataZoneId, selectedLockMode)
+                jobTicketRepository.getInProgressJobSize(realTimeDataZoneId, selectedWorkflowMode)
             allJobNum = jobTicketRepository.getAllJobSize(realTimeDataZoneId, startTime, endTime)
             emit(true)
         }
     }
+
+    /**
+     * 获取流程模式
+     */
+    fun getWorkflowMode(): LiveData<List<WorkflowMode>> {
+        return liveData(Dispatchers.IO) {
+            emit(workflowRepository.getWorkflowModes())
+        }
+    }
 }

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

@@ -2,8 +2,9 @@ package com.grkj.iscs.features.main.viewmodel.job_manage
 
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
-import com.grkj.data.enums.LockModeEnum
 import com.grkj.data.enums.RoleEnum
+import com.grkj.data.model.dos.WorkflowMode
+import com.grkj.data.model.dos.WorkflowStep
 import com.grkj.data.model.local.DeviceTakeUpdate
 import com.grkj.data.model.vo.IsJobTicketDataVo
 import com.grkj.data.model.vo.IsJobTicketKeyDataVo
@@ -13,6 +14,8 @@ import com.grkj.data.model.vo.IsJobTicketStepDataVo
 import com.grkj.data.model.vo.IsJobTicketUserDataVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.data.repository.IJobTicketRepository
+import com.grkj.data.repository.IWorkflowRepository
+import com.grkj.data.repository.impl.WorkflowRepository
 import com.grkj.iscs.R
 import com.grkj.ui_base.base.BaseViewModel
 import com.grkj.ui_base.business.BleBusinessManager
@@ -32,7 +35,10 @@ import java.util.concurrent.atomic.AtomicInteger
  * 作业执行数据
  */
 @HiltViewModel
-class JobExecuteViewModel @Inject constructor(val jobTicketRepository: IJobTicketRepository) :
+class JobExecuteViewModel @Inject constructor(
+    val jobTicketRepository: IJobTicketRepository,
+    val workflowRepository: IWorkflowRepository
+) :
     BaseViewModel() {
     var ticketId: Long = 0
     var ticketData: IsJobTicketDataVo? = null
@@ -45,6 +51,9 @@ class JobExecuteViewModel @Inject constructor(val jobTicketRepository: IJobTicke
     var selecteColockerData: List<UserManageVo> = mutableListOf()
     var checkMemberFinish: Boolean = false
     var currentStepData: IsJobTicketStepDataVo? = null
+    var workflowModes: List<WorkflowMode> = mutableListOf()
+    var workflowSteps: List<WorkflowStep> = mutableListOf()
+    var isUnlockFirst: Boolean = false
 
     /**
      * 获取作业数据
@@ -118,8 +127,8 @@ class JobExecuteViewModel @Inject constructor(val jobTicketRepository: IJobTicke
     fun toLock(): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
             ModbusBusinessManager.checkEquipCount(ticketPoints.count {
-                it.pointStatus == "0" || (it.pointStatus == "2" && LockModeEnum.isUnLockFirst(
-                    ticketData?.lockMode.toString()
+                it.pointStatus == "0" || (it.pointStatus == "2" && workflowRepository.isUnlockBeforeLock(
+                    ticketData?.modeId!!
                 ))
             }, true) { keyMap, lockMap ->
                 if (lockMap.isEmpty()) {
@@ -254,9 +263,39 @@ class JobExecuteViewModel @Inject constructor(val jobTicketRepository: IJobTicke
      * 根据卡片id获取用户id
      */
     fun getUserIdByCardRfid(rfid: String): LiveData<Long?> {
-        return liveData(Dispatchers.IO){
+        return liveData(Dispatchers.IO) {
             val userId = jobTicketRepository.getUserIdByCardRfid(rfid)
             emit(userId)
         }
     }
+
+    /**
+     * 获取流程模式列表
+     */
+    fun getWorkflowModes(): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            workflowModes = workflowRepository.getWorkflowModes()
+            emit(true)
+        }
+    }
+
+    /**
+     * 获取流程步骤列表
+     */
+    fun getWorkflowSteps(modeId: Long): LiveData<Boolean>{
+        return liveData(Dispatchers.IO){
+            workflowSteps = workflowRepository.getStepsByMode(modeId)
+            emit(true)
+        }
+    }
+
+    /**
+     * 是否解锁优先
+     */
+    fun isUnlockFirst(modeId: Long): LiveData<Boolean>{
+        return liveData(Dispatchers.IO){
+            isUnlockFirst = workflowRepository.isUnlockBeforeLock(modeId)
+            emit(true)
+        }
+    }
 }

+ 23 - 0
app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobManageHomeViewModel.kt

@@ -0,0 +1,23 @@
+package com.grkj.iscs.features.main.viewmodel.job_manage
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.liveData
+import com.grkj.data.repository.IJobTicketRepository
+import com.grkj.ui_base.base.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.Dispatchers
+import javax.inject.Inject
+
+@HiltViewModel
+class JobManageHomeViewModel @Inject constructor(
+    val jobTicketRepository: IJobTicketRepository
+): BaseViewModel() {
+    /**
+     * 获取正在进行中的作业
+     */
+    fun getInProgressJobCount(): LiveData<Int>{
+        return liveData(Dispatchers.IO){
+            emit(jobTicketRepository.getInProgressJobSize())
+        }
+    }
+}

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

@@ -4,16 +4,19 @@ import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
 import com.grkj.data.enums.RoleEnum
 import com.grkj.data.model.dos.IsWorkstation
+import com.grkj.data.model.dos.WorkflowMode
+import com.grkj.data.model.dos.WorkflowStep
 import com.grkj.data.model.vo.JobTicketManageVo
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.data.repository.IJobTicketRepository
 import com.grkj.data.repository.ISopRepository
+import com.grkj.data.repository.IWorkflowRepository
 import com.grkj.data.repository.IWorkstationRepository
 import com.grkj.ui_base.base.BaseViewModel
 import dagger.hilt.android.lifecycle.HiltViewModel
-import javax.inject.Inject
 import kotlinx.coroutines.Dispatchers
+import javax.inject.Inject
 
 /**
  * 作业界面模型
@@ -22,13 +25,16 @@ import kotlinx.coroutines.Dispatchers
 class JobViewModel @Inject constructor(
     val workstationRepository: IWorkstationRepository,
     val sopRepository: ISopRepository,
-    val jobTicketRepository: IJobTicketRepository
+    val jobTicketRepository: IJobTicketRepository,
+    val workflowRepository: IWorkflowRepository
 ) : BaseViewModel() {
     var workstationData: List<IsWorkstation> = listOf()
     var jobTicketData: JobTicketManageVo? = null
     var jobPointsData: List<PointManageVo> = mutableListOf()
     var jobLockerData: List<UserManageVo> = mutableListOf()
     var jobColockerData: List<UserManageVo> = mutableListOf()
+    var workflowModes: List<WorkflowMode> = mutableListOf()
+    var workflowSteps: List<WorkflowStep> = mutableListOf()
 
     /**
      * 初始化岗位数据
@@ -47,13 +53,13 @@ class JobViewModel @Inject constructor(
         selectedPointsData: List<PointManageVo>,
         selectedLockerData: List<UserManageVo>,
         selectedColockerData: List<UserManageVo>,
-        lockMode: String?,
+        workflowModeId: Long,
         workstationId: Long,
         sopName: String,
         sopId: Long = 0
     ): LiveData<Long> {
         return liveData(Dispatchers.IO) {
-            val sopId = sopRepository.saveSop(sopId, sopName, workstationId, lockMode)
+            val sopId = sopRepository.saveSop(sopId, sopName, workstationId, workflowModeId)
             sopRepository.saveSopPoint(selectedPointsData, sopId)
             sopRepository.saveSopUser(selectedLockerData, selectedColockerData, sopId)
             emit(sopId)
@@ -67,7 +73,7 @@ class JobViewModel @Inject constructor(
         selectedPoints: List<PointManageVo>,
         selectedLockerData: List<UserManageVo>,
         selectedColockerData: List<UserManageVo>,
-        lockMode: String?,
+        workflowModeId: Long,
         sopId: Long?,
         workstationId: Long,
         jobName: String
@@ -77,7 +83,7 @@ class JobViewModel @Inject constructor(
                 selectedPoints,
                 selectedLockerData,
                 selectedColockerData,
-                lockMode,
+                workflowModeId,
                 sopId,
                 workstationId,
                 jobName
@@ -93,7 +99,7 @@ class JobViewModel @Inject constructor(
         selectedPoints: List<PointManageVo>,
         selectedLockerData: List<UserManageVo>,
         selectedColockerData: List<UserManageVo>,
-        lockMode: String?,
+        workflowModeId: Long,
         sopId: Long?,
         workstationId: Long,
         jobName: String,
@@ -104,7 +110,7 @@ class JobViewModel @Inject constructor(
                 selectedPoints,
                 selectedLockerData,
                 selectedColockerData,
-                lockMode,
+                workflowModeId,
                 sopId,
                 workstationId,
                 jobName,
@@ -142,4 +148,24 @@ class JobViewModel @Inject constructor(
         }
     }
 
+    /**
+     * 获取流程模式列表
+     */
+    fun getWorkflowModes(): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            workflowModes = workflowRepository.getWorkflowModes()
+            emit(true)
+        }
+    }
+
+    /**
+     * 获取流程模式步骤
+     */
+    fun getWorkflowSteps(modeId: Long): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            workflowSteps = workflowRepository.getStepsByMode(modeId)
+            emit(true)
+        }
+    }
+
 }

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

@@ -2,19 +2,22 @@ package com.grkj.iscs.features.main.viewmodel.job_manage
 
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
+import com.grkj.data.enums.RoleEnum
 import com.grkj.data.model.dos.IsWorkstation
+import com.grkj.data.model.dos.WorkflowMode
+import com.grkj.data.model.dos.WorkflowStep
+import com.grkj.data.model.vo.JobTicketManageVo
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.SopManageVo
 import com.grkj.data.model.vo.UserManageVo
+import com.grkj.data.repository.IJobTicketRepository
 import com.grkj.data.repository.ISopRepository
+import com.grkj.data.repository.IWorkflowRepository
 import com.grkj.data.repository.IWorkstationRepository
-import com.grkj.data.enums.RoleEnum
-import com.grkj.data.model.vo.JobTicketManageVo
-import com.grkj.data.repository.IJobTicketRepository
 import com.grkj.ui_base.base.BaseViewModel
 import dagger.hilt.android.lifecycle.HiltViewModel
-import javax.inject.Inject
 import kotlinx.coroutines.Dispatchers
+import javax.inject.Inject
 
 /**
  * sop作业界面模型
@@ -23,7 +26,8 @@ import kotlinx.coroutines.Dispatchers
 class SopJobViewModel @Inject constructor(
     val workstationRepository: IWorkstationRepository,
     val sopRepository: ISopRepository,
-    val jobTicketRepository: IJobTicketRepository
+    val jobTicketRepository: IJobTicketRepository,
+    val workflowRepository: IWorkflowRepository
 ) : BaseViewModel() {
     var workstationData: List<IsWorkstation> = listOf()
     var sopData: List<SopManageVo> = listOf()
@@ -31,6 +35,9 @@ class SopJobViewModel @Inject constructor(
     var sopLockerData: List<UserManageVo> = listOf()
     var sopColockerData: List<UserManageVo> = listOf()
     var jobTicketData: JobTicketManageVo? = null
+    var workflowModes: List<WorkflowMode> = mutableListOf()
+    var workflowSteps: List<WorkflowStep> = mutableListOf()
+
 
     /**
      * 初始化岗位数据
@@ -73,7 +80,7 @@ class SopJobViewModel @Inject constructor(
         selectedSopPoints: List<PointManageVo>,
         selectedLockerData: List<UserManageVo>,
         selectedColockerData: List<UserManageVo>,
-        lockMode: String?,
+        modeId: Long,
         sopId: Long?,
         workstationId: Long,
         jobName: String
@@ -83,7 +90,7 @@ class SopJobViewModel @Inject constructor(
                 selectedSopPoints,
                 selectedLockerData,
                 selectedColockerData,
-                lockMode,
+                modeId,
                 sopId,
                 workstationId,
                 jobName
@@ -99,7 +106,7 @@ class SopJobViewModel @Inject constructor(
         selectedSopPoints: List<PointManageVo>,
         selectedLockerData: List<UserManageVo>,
         selectedColockerData: List<UserManageVo>,
-        lockMode: String?,
+        modeId: Long,
         sopId: Long?,
         workstationId: Long,
         jobName: String,
@@ -110,7 +117,7 @@ class SopJobViewModel @Inject constructor(
                 selectedSopPoints,
                 selectedLockerData,
                 selectedColockerData,
-                lockMode,
+                modeId,
                 sopId,
                 workstationId,
                 jobName,
@@ -146,4 +153,24 @@ class SopJobViewModel @Inject constructor(
             emit(true)
         }
     }
+
+    /**
+     * 获取流程模式列表
+     */
+    fun getWorkflowModes(): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            workflowModes = workflowRepository.getWorkflowModes()
+            emit(true)
+        }
+    }
+
+    /**
+     * 获取流程模式步骤
+     */
+    fun getWorkflowSteps(modeId: Long): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            workflowSteps = workflowRepository.getStepsByMode(modeId)
+            emit(true)
+        }
+    }
 }

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

@@ -3,12 +3,16 @@ package com.grkj.iscs.features.main.viewmodel.job_manage
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
 import com.grkj.data.model.dos.IsWorkstation
+import com.grkj.data.model.dos.WorkflowMode
+import com.grkj.data.model.dos.WorkflowStep
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.SopManageVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.data.repository.ISopRepository
+import com.grkj.data.repository.IWorkflowRepository
 import com.grkj.data.repository.IWorkstationRepository
 import com.grkj.data.repository.impl.SopRepository
+import com.grkj.data.repository.impl.WorkflowRepository
 import com.grkj.data.repository.impl.WorkstationRepository
 import com.grkj.ui_base.base.BaseViewModel
 import dagger.hilt.android.lifecycle.HiltViewModel
@@ -21,12 +25,15 @@ import kotlinx.coroutines.Dispatchers
 @HiltViewModel
 class SopViewModel @Inject constructor(
     val workstationRepository: IWorkstationRepository,
-    val sopRepository: ISopRepository
+    val sopRepository: ISopRepository,
+    val workflowRepository: IWorkflowRepository
 ) : BaseViewModel() {
     var workstationData: List<IsWorkstation> = listOf()
     var selectedSopData: SopManageVo? = null
     var selectedSopPointData: List<PointManageVo> = mutableListOf()
     var selectedSopUserData: List<UserManageVo> = mutableListOf()
+    var workflowModes: List<WorkflowMode> = mutableListOf()
+    var workflowSteps: List<WorkflowStep> = mutableListOf()
 
     /**
      * 初始化岗位数据
@@ -45,7 +52,7 @@ class SopViewModel @Inject constructor(
         selectedPointsData: List<PointManageVo>,
         selectedLockerData: List<UserManageVo>,
         selectedColockerData: List<UserManageVo>,
-        lockMode: String?,
+        modeId: Long,
         workstationId: Long,
         sopName: String,
         sopId: Long = 0
@@ -53,7 +60,7 @@ class SopViewModel @Inject constructor(
         return liveData(Dispatchers.IO) {
             sopRepository.deleteSopPointsBySopId(listOf(sopId))
             sopRepository.deleteSopUsersBySopId(listOf(sopId))
-            val sopId = sopRepository.saveSop(sopId, sopName, workstationId, lockMode)
+            val sopId = sopRepository.saveSop(sopId, sopName, workstationId, modeId)
             sopRepository.saveSopPoint(selectedPointsData, sopId)
             sopRepository.saveSopUser(selectedLockerData, selectedColockerData, sopId)
             emit(true)
@@ -71,4 +78,25 @@ class SopViewModel @Inject constructor(
             emit(true)
         }
     }
+
+    /**
+     * 获取流程模式列表
+     */
+    fun getWorkflowModes(): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            workflowModes = workflowRepository.getWorkflowModes()
+            emit(true)
+        }
+    }
+
+    /**
+     * 获取流程模式步骤
+     */
+    fun getWorkflowSteps(modeId: Long): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            workflowSteps = workflowRepository.getStepsByMode(modeId)
+            emit(true)
+        }
+    }
+
 }

+ 12 - 12
app/src/main/java/com/grkj/iscs/features/splash/activity/SplashActivity.kt

@@ -38,17 +38,17 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
         DialogX.titleTextInfo = dialogXTextInfo
         StartModbusEvent.sendStartModbusEvent()
         //todo 测试用,直接进入,不初始化
-//        startActivity(Intent(this, LoginActivity::class.java))
-//        finish()
-        viewModel.checkSysMenuAndRole().observe(this) {
-            val isAppInit = MMKVConstants.APP_INIT.getMMKVData(false)
-            if (isAppInit) {
-                startActivity(Intent(this, LoginActivity::class.java))
-                finish()
-            } else {
-                startActivity(Intent(this, InitActivity::class.java))
-                finish()
-            }
-        }
+        startActivity(Intent(this, LoginActivity::class.java))
+        finish()
+//        viewModel.checkSysMenuAndRole().observe(this) {
+//            val isAppInit = MMKVConstants.APP_INIT.getMMKVData(false)
+//            if (isAppInit) {
+//                startActivity(Intent(this, LoginActivity::class.java))
+//                finish()
+//            } else {
+//                startActivity(Intent(this, InitActivity::class.java))
+//                finish()
+//            }
+//        }
     }
 }

+ 0 - 26
app/src/main/java/com/grkj/iscs/utils/LockModeExtension.kt

@@ -1,26 +0,0 @@
-package com.grkj.iscs.utils
-
-import com.grkj.data.enums.LockModeEnum
-import com.grkj.iscs.R
-import com.grkj.ui_base.utils.CommonUtils
-
-
-/**
- * 获取锁定模式字符串
- */
-fun LockModeEnum.getLockModeStr(): String {
-    return when (this) {
-        LockModeEnum.LOCK_MODE_1 -> CommonUtils.getStr(R.string.lock_mode_1).toString()
-        LockModeEnum.LOCK_MODE_2 -> CommonUtils.getStr(R.string.lock_mode_2).toString()
-        LockModeEnum.LOCK_MODE_3 -> CommonUtils.getStr(R.string.lock_mode_3).toString()
-        LockModeEnum.LOCK_MODE_4 -> CommonUtils.getStr(R.string.lock_mode_4).toString()
-        LockModeEnum.LOCK_MODE_5 -> CommonUtils.getStr(R.string.lock_mode_5).toString()
-    }
-}
-
-/**
- * 获取锁定模式类型
- */
-fun LockModeEnum.getLockModeType(): String {
-    return this.lockMode.map { it.type }.joinToString(",")
-}

+ 166 - 94
app/src/main/res/layout-land/fragment_create_job.xml

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/create_job_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"
@@ -55,128 +55,201 @@
             android:orientation="horizontal">
 
             <LinearLayout
-                android:id="@+id/base_info_layout"
                 android:layout_width="0dp"
                 android:layout_height="match_parent"
                 android:layout_marginHorizontal="@dimen/common_spacing"
-                android:layout_marginVertical="@dimen/common_spacing"
                 android:layout_weight="1"
-                android:background="@drawable/home_card_bg"
-                android:gravity="center_vertical"
                 android:orientation="vertical">
 
-                <TextView
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/common_spacing"
-                    android:text="@string/base_info_title"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/normal_text_size_24" />
-
-                <View
-                    android:layout_width="match_parent"
-                    android:layout_height="@dimen/divider_line_space"
-                    android:background="@color/black" />
-
                 <LinearLayout
+                    android:id="@+id/base_info_layout"
                     android:layout_width="match_parent"
-                    android:layout_height="match_parent"
+                    android:layout_height="0dp"
+                    android:layout_marginVertical="@dimen/common_spacing"
+                    android:layout_weight="1"
+                    android:background="@drawable/home_card_bg"
+                    android:gravity="center_vertical"
                     android:orientation="vertical">
 
-                    <LinearLayout
+                    <TextView
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:layout_marginTop="@dimen/common_spacing_2x"
-                        android:gravity="center_vertical"
-                        android:orientation="horizontal"
-                        android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+                        android:layout_marginLeft="@dimen/common_spacing"
+                        android:text="@string/base_info_title"
+                        android:textColor="@color/black"
+                        android:textSize="@dimen/normal_text_size_18" />
 
-                        <TextView
-                            android:layout_width="wrap_content"
+                    <View
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/divider_line_space"
+                        android:background="@color/black" />
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:orientation="vertical">
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            android:text="@string/job_workstation"
-                            android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
+                            android:layout_marginTop="@dimen/common_spacing"
+                            android:gravity="center_vertical"
+                            android:orientation="horizontal"
+                            android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
 
-                        <TextView
-                            android:id="@+id/workstation_tv"
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="@string/job_workstation"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+
+                            <TextView
+                                android:id="@+id/workstation_tv"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:layout_marginLeft="@dimen/common_spacing"
+                                android:background="@drawable/bg_common_input"
+                                android:drawableRight="@drawable/icon_drop_down"
+                                android:hint="@string/please_select_job_workstation"
+                                android:maxLines="1"
+                                android:paddingHorizontal="@dimen/common_spacing"
+                                android:paddingVertical="2dp"
+                                android:singleLine="true"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+                        </LinearLayout>
+
+                        <LinearLayout
                             android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            android:layout_marginLeft="@dimen/common_spacing"
-                            android:background="@drawable/bg_common_input"
-                            android:drawableRight="@drawable/icon_drop_down"
-                            android:hint="@string/please_select_job_workstation"
-                            android:maxLines="1"
-                            android:paddingHorizontal="@dimen/common_spacing"
-                            android:paddingVertical="2dp"
-                            android:singleLine="true"
-                            android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
+                            android:layout_marginTop="@dimen/common_spacing"
+                            android:gravity="center_vertical"
+                            android:orientation="horizontal"
+                            android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="@string/workflow_mode"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+
+                            <TextView
+                                android:id="@+id/lock_mode_tv"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:layout_marginLeft="@dimen/common_spacing"
+                                android:background="@drawable/bg_common_input"
+                                android:drawableRight="@drawable/icon_drop_down"
+                                android:hint="@string/please_select_flow_mode"
+                                android:maxLines="1"
+                                android:paddingHorizontal="@dimen/common_spacing"
+                                android:paddingVertical="2dp"
+                                android:singleLine="true"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="@dimen/common_spacing"
+                            android:layout_marginBottom="@dimen/common_spacing"
+                            android:gravity="center_vertical"
+                            android:orientation="horizontal"
+                            android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="@string/create_job_name"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+
+                            <EditText
+                                android:id="@+id/job_name_et"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:layout_marginLeft="@dimen/common_spacing"
+                                android:background="@drawable/bg_common_input"
+                                android:hint="@string/please_input_job_name"
+                                android:maxLines="1"
+                                android:paddingHorizontal="@dimen/common_spacing"
+                                android:paddingVertical="2dp"
+                                android:singleLine="true"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+                        </LinearLayout>
                     </LinearLayout>
 
+                </LinearLayout>
+
+                <LinearLayout
+                    android:id="@+id/workflow_mode_layout"
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    android:layout_weight="1"
+                    android:background="@drawable/home_card_bg"
+                    android:gravity="center_vertical"
+                    android:orientation="vertical">
+
                     <LinearLayout
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:layout_marginTop="@dimen/common_spacing_2x"
-                        android:gravity="center_vertical"
-                        android:orientation="horizontal"
-                        android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+                        android:orientation="horizontal">
 
                         <TextView
-                            android:layout_width="wrap_content"
+                            android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            android:text="@string/flow_mode"
+                            android:layout_marginLeft="@dimen/common_spacing"
+                            android:layout_weight="1"
+                            android:text="@string/workflow_mode"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <TextView
-                            android:id="@+id/lock_mode_tv"
-                            android:layout_width="match_parent"
+                            android:id="@+id/workflow_mode_setting_tv"
+                            android:layout_width="wrap_content"
                             android:layout_height="wrap_content"
                             android:layout_marginLeft="@dimen/common_spacing"
-                            android:background="@drawable/bg_common_input"
-                            android:drawableRight="@drawable/icon_drop_down"
-                            android:hint="@string/please_select_flow_mode"
-                            android:maxLines="1"
-                            android:paddingHorizontal="@dimen/common_spacing"
-                            android:paddingVertical="2dp"
-                            android:singleLine="true"
+                            android:layout_marginRight="@dimen/common_spacing"
+                            android:background="@drawable/common_btn"
+                            android:paddingHorizontal="@dimen/common_spacing_2x"
+                            android:text="@string/settings"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
+                            android:textSize="@dimen/common_btn_text_size" />
                     </LinearLayout>
 
-                    <LinearLayout
+                    <View
                         android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginTop="@dimen/common_spacing_2x"
-                        android:layout_marginBottom="@dimen/common_spacing_2x"
-                        android:gravity="center_vertical"
-                        android:orientation="horizontal"
-                        android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+                        android:layout_height="@dimen/divider_line_space"
+                        android:background="@color/black" />
 
-                        <TextView
-                            android:layout_width="wrap_content"
-                            android:layout_height="wrap_content"
-                            android:text="@string/create_job_name"
-                            android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
+                    <FrameLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:background="@drawable/card_white_bg">
 
-                        <EditText
-                            android:id="@+id/job_name_et"
+                        <androidx.recyclerview.widget.RecyclerView
+                            android:id="@+id/workflow_rv"
                             android:layout_width="match_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_marginLeft="@dimen/common_spacing"
-                            android:background="@drawable/bg_common_input"
-                            android:hint="@string/please_input_job_name"
-                            android:maxLines="1"
-                            android:paddingHorizontal="@dimen/common_spacing"
-                            android:paddingVertical="2dp"
-                            android:singleLine="true"
+                            android:layout_height="match_parent"
+                            android:paddingBottom="@dimen/common_spacing" />
+
+                        <TextView
+                            android:id="@+id/select_workflow_tip"
+                            android:layout_width="match_parent"
+                            android:layout_height="match_parent"
+                            android:background="@drawable/card_white_bg"
+                            android:gravity="center"
+                            android:paddingHorizontal="@dimen/common_spacing_2x"
+                            android:paddingVertical="@dimen/common_spacing"
+                            android:text="@string/please_select_workflow_mode"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
-                    </LinearLayout>
+                            android:textSize="@dimen/normal_text_size_18" />
+                    </FrameLayout>
                 </LinearLayout>
-
             </LinearLayout>
 
             <LinearLayout
@@ -190,7 +263,7 @@
                     android:layout_width="match_parent"
                     android:layout_height="0dp"
                     android:layout_marginHorizontal="@dimen/common_spacing"
-                    android:layout_marginVertical="@dimen/common_spacing"
+                    android:layout_marginTop="@dimen/common_spacing"
                     android:layout_weight="1"
                     android:background="@drawable/home_card_bg"
                     android:gravity="center_vertical"
@@ -208,7 +281,7 @@
                             android:layout_weight="1"
                             android:text="@string/point_info_title"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <TextView
                             android:id="@+id/select_point_tv"
@@ -259,7 +332,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/please_must_select_at_least_one_point"
                                 android:textColor="@color/black"
-                                android:textSize="@dimen/normal_text_size_24" />
+                                android:textSize="@dimen/normal_text_size_18" />
                         </LinearLayout>
                     </FrameLayout>
 
@@ -270,7 +343,7 @@
                     android:layout_width="match_parent"
                     android:layout_height="0dp"
                     android:layout_marginHorizontal="@dimen/common_spacing"
-                    android:layout_marginVertical="@dimen/common_spacing"
+                    android:layout_marginTop="@dimen/common_spacing"
                     android:layout_weight="1"
                     android:background="@drawable/home_card_bg"
                     android:gravity="center_vertical"
@@ -288,7 +361,7 @@
                             android:layout_weight="1"
                             android:text="@string/member_info_title"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <TextView
                             android:id="@+id/select_member_tv"
@@ -332,7 +405,7 @@
                                     android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/locker"
                                     android:textColor="@color/black"
-                                    android:textSize="@dimen/normal_text_size_24" />
+                                    android:textSize="@dimen/normal_text_size_18" />
 
                                 <View
                                     android:layout_width="match_parent"
@@ -379,7 +452,7 @@
                                     android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/colocker"
                                     android:textColor="@color/black"
-                                    android:textSize="@dimen/normal_text_size_24" />
+                                    android:textSize="@dimen/normal_text_size_18" />
 
                                 <View
                                     android:layout_width="match_parent"
@@ -415,7 +488,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/please_select_member"
                                 android:textColor="@color/black"
-                                android:textSize="@dimen/normal_text_size_24" />
+                                android:textSize="@dimen/normal_text_size_18" />
                         </LinearLayout>
                     </FrameLayout>
                 </LinearLayout>
@@ -425,8 +498,7 @@
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:orientation="horizontal"
-            android:padding="@dimen/common_spacing">
+            android:orientation="horizontal">
 
             <CheckBox
                 android:id="@+id/save_sop"

+ 167 - 94
app/src/main/res/layout-land/fragment_create_sop.xml

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/create_sop_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"
@@ -55,130 +55,203 @@
             android:orientation="horizontal">
 
             <LinearLayout
-                android:id="@+id/base_info_layout"
                 android:layout_width="0dp"
                 android:layout_height="match_parent"
                 android:layout_marginHorizontal="@dimen/common_spacing"
-                android:layout_marginTop="@dimen/common_spacing"
-                android:layout_marginBottom="@dimen/common_spacing"
                 android:layout_weight="1"
-                android:background="@drawable/home_card_bg"
-                android:gravity="center_vertical"
                 android:orientation="vertical">
 
-                <TextView
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/common_spacing"
-                    android:text="@string/base_info_title"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/normal_text_size_24" />
-
-                <View
-                    android:layout_width="match_parent"
-                    android:layout_height="@dimen/divider_line_space"
-                    android:background="@color/black" />
-
                 <LinearLayout
+                    android:id="@+id/base_info_layout"
                     android:layout_width="match_parent"
-                    android:layout_height="match_parent"
+                    android:layout_height="0dp"
+                    android:layout_marginVertical="@dimen/common_spacing"
+                    android:layout_weight="1"
+                    android:background="@drawable/home_card_bg"
+                    android:gravity="center_vertical"
                     android:orientation="vertical">
 
-                    <LinearLayout
+                    <TextView
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:layout_marginTop="@dimen/common_spacing_2x"
-                        android:gravity="center_vertical"
-                        android:orientation="horizontal"
-                        android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+                        android:layout_marginLeft="@dimen/common_spacing"
+                        android:text="@string/base_info_title"
+                        android:textColor="@color/black"
+                        android:textSize="@dimen/normal_text_size_18" />
 
-                        <TextView
-                            android:layout_width="wrap_content"
+                    <View
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/divider_line_space"
+                        android:background="@color/black" />
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:orientation="vertical">
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            android:text="@string/sop_workstation"
-                            android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
+                            android:layout_marginTop="@dimen/common_spacing"
+                            android:gravity="center_vertical"
+                            android:orientation="horizontal"
+                            android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
 
-                        <TextView
-                            android:id="@+id/workstation_tv"
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="@string/sop_workstation"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+
+                            <TextView
+                                android:id="@+id/workstation_tv"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:layout_marginLeft="@dimen/common_spacing"
+                                android:background="@drawable/bg_common_input"
+                                android:drawableRight="@drawable/icon_drop_down"
+                                android:hint="@string/please_select_sop_workstation"
+                                android:maxLines="1"
+                                android:paddingHorizontal="@dimen/common_spacing"
+                                android:paddingVertical="2dp"
+                                android:singleLine="true"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+                        </LinearLayout>
+
+                        <LinearLayout
                             android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            android:layout_marginLeft="@dimen/common_spacing"
-                            android:background="@drawable/bg_common_input"
-                            android:drawableRight="@drawable/icon_drop_down"
-                            android:hint="@string/please_select_sop_workstation"
-                            android:maxLines="1"
-                            android:paddingHorizontal="@dimen/common_spacing"
-                            android:paddingVertical="2dp"
-                            android:singleLine="true"
-                            android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
+                            android:layout_marginTop="@dimen/common_spacing"
+                            android:gravity="center_vertical"
+                            android:orientation="horizontal"
+                            android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="@string/workflow_mode"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+
+                            <TextView
+                                android:id="@+id/lock_mode_tv"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:layout_marginLeft="@dimen/common_spacing"
+                                android:background="@drawable/bg_common_input"
+                                android:drawableRight="@drawable/icon_drop_down"
+                                android:hint="@string/please_select_flow_mode"
+                                android:maxLines="1"
+                                android:paddingHorizontal="@dimen/common_spacing"
+                                android:paddingVertical="2dp"
+                                android:singleLine="true"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="@dimen/common_spacing"
+                            android:layout_marginBottom="@dimen/common_spacing"
+                            android:gravity="center_vertical"
+                            android:orientation="horizontal"
+                            android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="@string/create_sop_name"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+
+                            <EditText
+                                android:id="@+id/sop_name_et"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:layout_marginLeft="@dimen/common_spacing"
+                                android:background="@drawable/bg_common_input"
+                                android:hint="@string/please_input_sop_name"
+                                android:maxLines="1"
+                                android:paddingHorizontal="@dimen/common_spacing"
+                                android:paddingVertical="2dp"
+                                android:singleLine="true"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+                        </LinearLayout>
                     </LinearLayout>
+                </LinearLayout>
+
+                <LinearLayout
+                    android:id="@+id/workflow_mode_layout"
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    android:layout_weight="1"
+                    android:background="@drawable/home_card_bg"
+                    android:gravity="center_vertical"
+                    android:orientation="vertical">
 
                     <LinearLayout
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:layout_marginTop="@dimen/common_spacing_2x"
-                        android:gravity="center_vertical"
-                        android:orientation="horizontal"
-                        android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+                        android:orientation="horizontal">
 
                         <TextView
-                            android:layout_width="wrap_content"
+                            android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            android:text="@string/flow_mode"
+                            android:layout_marginLeft="@dimen/common_spacing"
+                            android:layout_weight="1"
+                            android:text="@string/workflow_mode"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <TextView
-                            android:id="@+id/lock_mode_tv"
-                            android:layout_width="match_parent"
+                            android:id="@+id/workflow_mode_setting_tv"
+                            android:layout_width="wrap_content"
                             android:layout_height="wrap_content"
                             android:layout_marginLeft="@dimen/common_spacing"
-                            android:background="@drawable/bg_common_input"
-                            android:drawableRight="@drawable/icon_drop_down"
-                            android:hint="@string/please_select_flow_mode"
-                            android:maxLines="1"
-                            android:paddingHorizontal="@dimen/common_spacing"
-                            android:paddingVertical="2dp"
-                            android:singleLine="true"
+                            android:layout_marginRight="@dimen/common_spacing"
+                            android:background="@drawable/common_btn"
+                            android:paddingHorizontal="@dimen/common_spacing_2x"
+                            android:text="@string/settings"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
+                            android:textSize="@dimen/common_btn_text_size" />
                     </LinearLayout>
 
-                    <LinearLayout
+                    <View
                         android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginTop="@dimen/common_spacing_2x"
-                        android:layout_marginBottom="@dimen/common_spacing_2x"
-                        android:gravity="center_vertical"
-                        android:orientation="horizontal"
-                        android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+                        android:layout_height="@dimen/divider_line_space"
+                        android:background="@color/black" />
 
-                        <TextView
-                            android:layout_width="wrap_content"
-                            android:layout_height="wrap_content"
-                            android:text="@string/create_sop_name"
-                            android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
+                    <FrameLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:background="@drawable/card_white_bg">
 
-                        <EditText
-                            android:id="@+id/sop_name_et"
+                        <androidx.recyclerview.widget.RecyclerView
+                            android:id="@+id/workflow_rv"
                             android:layout_width="match_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_marginLeft="@dimen/common_spacing"
-                            android:background="@drawable/bg_common_input"
-                            android:hint="@string/please_input_sop_name"
-                            android:maxLines="1"
-                            android:paddingHorizontal="@dimen/common_spacing"
-                            android:paddingVertical="2dp"
-                            android:singleLine="true"
+                            android:layout_height="match_parent"
+                            android:paddingBottom="@dimen/common_spacing" />
+
+                        <TextView
+                            android:id="@+id/select_workflow_tip"
+                            android:layout_width="match_parent"
+                            android:layout_height="match_parent"
+                            android:background="@drawable/card_white_bg"
+                            android:gravity="center"
+                            android:paddingHorizontal="@dimen/common_spacing_2x"
+                            android:paddingVertical="@dimen/common_spacing"
+                            android:text="@string/please_select_workflow_mode"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
-                    </LinearLayout>
+                            android:textSize="@dimen/normal_text_size_18" />
+                    </FrameLayout>
                 </LinearLayout>
             </LinearLayout>
 
+
             <LinearLayout
                 android:layout_width="0dp"
                 android:layout_height="match_parent"
@@ -188,9 +261,9 @@
                 <LinearLayout
                     android:id="@+id/point_info_layout"
                     android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
+                    android:layout_height="0dp"
                     android:layout_marginHorizontal="@dimen/common_spacing"
-                    android:layout_marginVertical="@dimen/common_spacing"
+                    android:layout_marginTop="@dimen/common_spacing"
                     android:layout_weight="1"
                     android:background="@drawable/home_card_bg"
                     android:gravity="center_vertical"
@@ -208,7 +281,7 @@
                             android:layout_weight="1"
                             android:text="@string/point_info_title"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <TextView
                             android:id="@+id/select_point_tv"
@@ -259,7 +332,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/please_must_select_at_least_one_point"
                                 android:textColor="@color/black"
-                                android:textSize="@dimen/normal_text_size_24" />
+                                android:textSize="@dimen/normal_text_size_18" />
                         </LinearLayout>
                     </FrameLayout>
 
@@ -268,9 +341,9 @@
                 <LinearLayout
                     android:id="@+id/member_info_layout"
                     android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
+                    android:layout_height="0dp"
                     android:layout_marginHorizontal="@dimen/common_spacing"
-                    android:layout_marginVertical="@dimen/common_spacing"
+                    android:layout_marginTop="@dimen/common_spacing"
                     android:layout_weight="1"
                     android:background="@drawable/home_card_bg"
                     android:gravity="center_vertical"
@@ -288,7 +361,7 @@
                             android:layout_weight="1"
                             android:text="@string/member_info_title"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <TextView
                             android:id="@+id/select_member_tv"
@@ -332,7 +405,7 @@
                                     android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/locker"
                                     android:textColor="@color/black"
-                                    android:textSize="@dimen/normal_text_size_24" />
+                                    android:textSize="@dimen/normal_text_size_18" />
 
                                 <View
                                     android:layout_width="match_parent"
@@ -379,7 +452,7 @@
                                     android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/colocker"
                                     android:textColor="@color/black"
-                                    android:textSize="@dimen/normal_text_size_24" />
+                                    android:textSize="@dimen/normal_text_size_18" />
 
                                 <View
                                     android:layout_width="match_parent"
@@ -415,7 +488,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/please_select_member"
                                 android:textColor="@color/black"
-                                android:textSize="@dimen/normal_text_size_24" />
+                                android:textSize="@dimen/normal_text_size_18" />
                         </LinearLayout>
                     </FrameLayout>
                 </LinearLayout>

+ 168 - 97
app/src/main/res/layout-land/fragment_create_sop_job.xml

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/create_sop_job_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"
@@ -55,130 +55,201 @@
             android:orientation="horizontal">
 
             <LinearLayout
-                android:id="@+id/base_info_layout"
                 android:layout_width="0dp"
                 android:layout_height="match_parent"
                 android:layout_marginHorizontal="@dimen/common_spacing"
-                android:layout_marginTop="@dimen/common_spacing"
-                android:layout_marginBottom="@dimen/common_spacing"
                 android:layout_weight="1"
-                android:background="@drawable/home_card_bg"
-                android:gravity="center_vertical"
                 android:orientation="vertical">
 
-                <TextView
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/common_spacing"
-                    android:text="@string/base_info_title"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/normal_text_size_24" />
-
-                <View
-                    android:layout_width="match_parent"
-                    android:layout_height="@dimen/divider_line_space"
-                    android:background="@color/black" />
-
                 <LinearLayout
+                    android:id="@+id/base_info_layout"
                     android:layout_width="match_parent"
-                    android:layout_height="match_parent"
+                    android:layout_height="0dp"
+                    android:layout_marginVertical="@dimen/common_spacing"
+                    android:layout_weight="1"
+                    android:background="@drawable/home_card_bg"
+                    android:gravity="center_vertical"
                     android:orientation="vertical">
 
-                    <LinearLayout
+                    <TextView
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:layout_marginTop="@dimen/common_spacing_2x"
-                        android:gravity="center_vertical"
-                        android:orientation="horizontal"
-                        android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+                        android:layout_marginLeft="@dimen/common_spacing"
+                        android:text="@string/base_info_title"
+                        android:textColor="@color/black"
+                        android:textSize="@dimen/normal_text_size_18" />
 
-                        <TextView
-                            android:layout_width="wrap_content"
+                    <View
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/divider_line_space"
+                        android:background="@color/black" />
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:orientation="vertical">
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            android:text="@string/sop_workstation"
-                            android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
+                            android:layout_marginTop="@dimen/common_spacing"
+                            android:gravity="center_vertical"
+                            android:orientation="horizontal"
+                            android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
 
-                        <TextView
-                            android:id="@+id/workstation_tv"
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="@string/sop_workstation"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+
+                            <TextView
+                                android:id="@+id/workstation_tv"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:layout_marginLeft="@dimen/common_spacing"
+                                android:background="@drawable/bg_common_input"
+                                android:drawableRight="@drawable/icon_drop_down"
+                                android:hint="@string/please_select_sop_workstation"
+                                android:maxLines="1"
+                                android:paddingHorizontal="@dimen/common_spacing"
+                                android:paddingVertical="2dp"
+                                android:singleLine="true"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+                        </LinearLayout>
+
+                        <LinearLayout
                             android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            android:layout_marginLeft="@dimen/common_spacing"
-                            android:background="@drawable/bg_common_input"
-                            android:drawableRight="@drawable/icon_drop_down"
-                            android:hint="@string/please_select_sop_workstation"
-                            android:maxLines="1"
-                            android:paddingHorizontal="@dimen/common_spacing"
-                            android:paddingVertical="2dp"
-                            android:singleLine="true"
-                            android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
+                            android:layout_marginLeft="36dp"
+                            android:layout_marginTop="@dimen/common_spacing"
+                            android:gravity="center_vertical"
+                            android:orientation="horizontal"
+                            android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="@string/create_sop_job_sop"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+
+                            <TextView
+                                android:id="@+id/sop_tv"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:layout_marginLeft="@dimen/common_spacing"
+                                android:background="@drawable/bg_common_input"
+                                android:drawableRight="@drawable/icon_drop_down"
+                                android:hint="@string/please_select_sop"
+                                android:maxLines="1"
+                                android:paddingHorizontal="@dimen/common_spacing"
+                                android:paddingVertical="2dp"
+                                android:singleLine="true"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="@dimen/common_spacing"
+                            android:layout_marginBottom="@dimen/common_spacing"
+                            android:gravity="center_vertical"
+                            android:orientation="horizontal"
+                            android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="@string/job_name"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+
+                            <EditText
+                                android:id="@+id/job_name_et"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:layout_marginLeft="@dimen/common_spacing"
+                                android:background="@drawable/bg_common_input"
+                                android:hint="@string/please_input_job_name"
+                                android:maxLines="1"
+                                android:paddingHorizontal="@dimen/common_spacing"
+                                android:paddingVertical="2dp"
+                                android:singleLine="true"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+                        </LinearLayout>
                     </LinearLayout>
+                </LinearLayout>
+
+                <LinearLayout
+                    android:id="@+id/workflow_mode_layout"
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    android:layout_weight="1"
+                    android:background="@drawable/home_card_bg"
+                    android:gravity="center_vertical"
+                    android:orientation="vertical">
 
                     <LinearLayout
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:layout_marginLeft="36dp"
-                        android:layout_marginTop="@dimen/common_spacing_2x"
-                        android:gravity="center_vertical"
-                        android:orientation="horizontal"
-                        android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+                        android:orientation="horizontal">
 
                         <TextView
-                            android:layout_width="wrap_content"
+                            android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            android:text="@string/create_sop_job_sop"
+                            android:layout_marginLeft="@dimen/common_spacing"
+                            android:layout_weight="1"
+                            android:text="@string/workflow_mode"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <TextView
-                            android:id="@+id/sop_tv"
-                            android:layout_width="match_parent"
+                            android:id="@+id/workflow_mode_setting_tv"
+                            android:layout_width="wrap_content"
                             android:layout_height="wrap_content"
                             android:layout_marginLeft="@dimen/common_spacing"
-                            android:background="@drawable/bg_common_input"
-                            android:drawableRight="@drawable/icon_drop_down"
-                            android:hint="@string/please_select_sop"
-                            android:maxLines="1"
-                            android:paddingHorizontal="@dimen/common_spacing"
-                            android:paddingVertical="2dp"
-                            android:singleLine="true"
+                            android:layout_marginRight="@dimen/common_spacing"
+                            android:background="@drawable/common_btn"
+                            android:paddingHorizontal="@dimen/common_spacing_2x"
+                            android:text="@string/settings"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
+                            android:textSize="@dimen/common_btn_text_size" />
                     </LinearLayout>
 
-                    <LinearLayout
+                    <View
                         android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginTop="@dimen/common_spacing_2x"
-                        android:layout_marginBottom="@dimen/common_spacing_2x"
-                        android:gravity="center_vertical"
-                        android:orientation="horizontal"
-                        android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+                        android:layout_height="@dimen/divider_line_space"
+                        android:background="@color/black" />
 
-                        <TextView
-                            android:layout_width="wrap_content"
-                            android:layout_height="wrap_content"
-                            android:text="@string/job_name"
-                            android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
+                    <FrameLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:background="@drawable/card_white_bg">
 
-                        <EditText
-                            android:id="@+id/job_name_et"
+                        <androidx.recyclerview.widget.RecyclerView
+                            android:id="@+id/workflow_rv"
                             android:layout_width="match_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_marginLeft="@dimen/common_spacing"
-                            android:background="@drawable/bg_common_input"
-                            android:hint="@string/please_input_job_name"
-                            android:maxLines="1"
-                            android:paddingHorizontal="@dimen/common_spacing"
-                            android:paddingVertical="2dp"
-                            android:singleLine="true"
+                            android:layout_height="match_parent"
+                            android:paddingBottom="@dimen/common_spacing" />
+
+                        <TextView
+                            android:id="@+id/select_workflow_tip"
+                            android:layout_width="match_parent"
+                            android:layout_height="match_parent"
+                            android:background="@drawable/card_white_bg"
+                            android:gravity="center"
+                            android:paddingHorizontal="@dimen/common_spacing_2x"
+                            android:paddingVertical="@dimen/common_spacing"
+                            android:text="@string/please_select_workflow_mode"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
-                    </LinearLayout>
+                            android:textSize="@dimen/normal_text_size_18" />
+                    </FrameLayout>
                 </LinearLayout>
-
             </LinearLayout>
 
             <LinearLayout
@@ -190,9 +261,9 @@
                 <LinearLayout
                     android:id="@+id/point_info_layout"
                     android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
+                    android:layout_height="0dp"
                     android:layout_marginHorizontal="@dimen/common_spacing"
-                    android:layout_marginVertical="@dimen/common_spacing"
+                    android:layout_marginTop="@dimen/common_spacing"
                     android:layout_weight="1"
                     android:background="@drawable/home_card_bg"
                     android:gravity="center_vertical"
@@ -210,7 +281,7 @@
                             android:layout_weight="1"
                             android:text="@string/point_info_title"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                     </LinearLayout>
 
@@ -226,7 +297,7 @@
                         <androidx.recyclerview.widget.RecyclerView
                             android:id="@+id/point_rv"
                             android:layout_width="match_parent"
-                            android:layout_height="240dp"
+                            android:layout_height="match_parent"
                             android:paddingBottom="@dimen/common_spacing" />
 
                         <LinearLayout
@@ -254,9 +325,9 @@
                 <LinearLayout
                     android:id="@+id/member_info_layout"
                     android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
+                    android:layout_height="0dp"
                     android:layout_marginHorizontal="@dimen/common_spacing"
-                    android:layout_marginVertical="@dimen/common_spacing"
+                    android:layout_marginTop="@dimen/common_spacing"
                     android:layout_weight="1"
                     android:background="@drawable/home_card_bg"
                     android:gravity="center_vertical"
@@ -274,7 +345,7 @@
                             android:layout_weight="1"
                             android:text="@string/member_info_title"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <TextView
                             android:id="@+id/select_member_tv"
@@ -318,7 +389,7 @@
                                     android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/locker"
                                     android:textColor="@color/black"
-                                    android:textSize="@dimen/normal_text_size_24" />
+                                    android:textSize="@dimen/normal_text_size_18" />
 
                                 <View
                                     android:layout_width="match_parent"
@@ -365,7 +436,7 @@
                                     android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/colocker"
                                     android:textColor="@color/black"
-                                    android:textSize="@dimen/normal_text_size_24" />
+                                    android:textSize="@dimen/normal_text_size_18" />
 
                                 <View
                                     android:layout_width="match_parent"
@@ -390,7 +461,7 @@
 
                             <TextView
                                 android:layout_width="wrap_content"
-                                android:layout_height="wrap_content"
+                                android:layout_height="match_parent"
                                 android:gravity="center"
                                 android:paddingHorizontal="@dimen/common_spacing_2x"
                                 android:paddingVertical="@dimen/common_spacing"
@@ -409,7 +480,7 @@
             android:layout_height="wrap_content"
             android:gravity="right"
             android:orientation="horizontal"
-            android:padding="@dimen/common_spacing">
+            android:paddingVertical="@dimen/common_spacing">
 
             <TextView
                 android:id="@+id/save_and_execute"

+ 166 - 93
app/src/main/res/layout-land/fragment_edit_job.xml

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/edit_job_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"
@@ -55,127 +55,200 @@
             android:orientation="horizontal">
 
             <LinearLayout
-                android:id="@+id/base_info_layout"
                 android:layout_width="0dp"
                 android:layout_height="match_parent"
                 android:layout_marginHorizontal="@dimen/common_spacing"
-                android:layout_marginTop="@dimen/common_spacing"
-                android:layout_marginBottom="@dimen/common_spacing"
                 android:layout_weight="1"
-                android:background="@drawable/home_card_bg"
-                android:gravity="center_vertical"
                 android:orientation="vertical">
 
-                <TextView
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/common_spacing"
-                    android:text="@string/base_info_title"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/normal_text_size_24" />
-
-                <View
-                    android:layout_width="match_parent"
-                    android:layout_height="@dimen/divider_line_space"
-                    android:background="@color/black" />
-
                 <LinearLayout
+                    android:id="@+id/base_info_layout"
                     android:layout_width="match_parent"
-                    android:layout_height="match_parent"
+                    android:layout_height="0dp"
+                    android:layout_marginTop="@dimen/common_spacing"
+                    android:layout_marginBottom="@dimen/common_spacing"
+                    android:layout_weight="1"
+                    android:background="@drawable/home_card_bg"
+                    android:gravity="center_vertical"
                     android:orientation="vertical">
 
-                    <LinearLayout
+                    <TextView
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:layout_marginTop="@dimen/common_spacing_2x"
-                        android:gravity="center_vertical"
-                        android:orientation="horizontal"
-                        android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+                        android:layout_marginLeft="@dimen/common_spacing"
+                        android:text="@string/base_info_title"
+                        android:textColor="@color/black"
+                        android:textSize="@dimen/normal_text_size_18" />
 
-                        <TextView
-                            android:layout_width="wrap_content"
+                    <View
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/divider_line_space"
+                        android:background="@color/black" />
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:orientation="vertical">
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            android:text="@string/job_workstation"
-                            android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
+                            android:layout_marginTop="@dimen/common_spacing"
+                            android:gravity="center_vertical"
+                            android:orientation="horizontal"
+                            android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
 
-                        <TextView
-                            android:id="@+id/workstation_tv"
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="@string/job_workstation"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+
+                            <TextView
+                                android:id="@+id/workstation_tv"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:layout_marginLeft="@dimen/common_spacing"
+                                android:background="@drawable/bg_common_input"
+                                android:drawableRight="@drawable/icon_drop_down"
+                                android:hint="@string/please_select_job_workstation"
+                                android:maxLines="1"
+                                android:paddingHorizontal="@dimen/common_spacing"
+                                android:paddingVertical="2dp"
+                                android:singleLine="true"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+                        </LinearLayout>
+
+                        <LinearLayout
                             android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            android:layout_marginLeft="@dimen/common_spacing"
-                            android:background="@drawable/bg_common_input"
-                            android:drawableRight="@drawable/icon_drop_down"
-                            android:hint="@string/please_select_job_workstation"
-                            android:maxLines="1"
-                            android:paddingHorizontal="@dimen/common_spacing"
-                            android:paddingVertical="2dp"
-                            android:singleLine="true"
-                            android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
+                            android:layout_marginTop="@dimen/common_spacing"
+                            android:gravity="center_vertical"
+                            android:orientation="horizontal"
+                            android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="@string/workflow_mode"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+
+                            <TextView
+                                android:id="@+id/lock_mode_tv"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:layout_marginLeft="@dimen/common_spacing"
+                                android:background="@drawable/bg_common_input"
+                                android:drawableRight="@drawable/icon_drop_down"
+                                android:hint="@string/please_select_flow_mode"
+                                android:maxLines="1"
+                                android:paddingHorizontal="@dimen/common_spacing"
+                                android:paddingVertical="2dp"
+                                android:singleLine="true"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="@dimen/common_spacing"
+                            android:layout_marginBottom="@dimen/common_spacing"
+                            android:gravity="center_vertical"
+                            android:orientation="horizontal"
+                            android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="@string/create_job_name"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+
+                            <EditText
+                                android:id="@+id/job_name_et"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:layout_marginLeft="@dimen/common_spacing"
+                                android:background="@drawable/bg_common_input"
+                                android:hint="@string/please_input_job_name"
+                                android:maxLines="1"
+                                android:paddingHorizontal="@dimen/common_spacing"
+                                android:paddingVertical="2dp"
+                                android:singleLine="true"
+                                android:textColor="@color/black"
+                                android:textSize="@dimen/common_text_size" />
+                        </LinearLayout>
                     </LinearLayout>
+                </LinearLayout>
+
+                <LinearLayout
+                    android:id="@+id/workflow_mode_layout"
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    android:layout_weight="1"
+                    android:background="@drawable/home_card_bg"
+                    android:gravity="center_vertical"
+                    android:orientation="vertical">
 
                     <LinearLayout
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:layout_marginTop="@dimen/common_spacing_2x"
-                        android:gravity="center_vertical"
-                        android:orientation="horizontal"
-                        android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+                        android:orientation="horizontal">
 
                         <TextView
-                            android:layout_width="wrap_content"
+                            android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            android:text="@string/flow_mode"
+                            android:layout_marginLeft="@dimen/common_spacing"
+                            android:layout_weight="1"
+                            android:text="@string/workflow_mode"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <TextView
-                            android:id="@+id/lock_mode_tv"
-                            android:layout_width="match_parent"
+                            android:id="@+id/workflow_mode_setting_tv"
+                            android:layout_width="wrap_content"
                             android:layout_height="wrap_content"
                             android:layout_marginLeft="@dimen/common_spacing"
-                            android:background="@drawable/bg_common_input"
-                            android:drawableRight="@drawable/icon_drop_down"
-                            android:hint="@string/please_select_flow_mode"
-                            android:maxLines="1"
-                            android:paddingHorizontal="@dimen/common_spacing"
-                            android:paddingVertical="2dp"
-                            android:singleLine="true"
+                            android:layout_marginRight="@dimen/common_spacing"
+                            android:background="@drawable/common_btn"
+                            android:paddingHorizontal="@dimen/common_spacing_2x"
+                            android:text="@string/settings"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
+                            android:textSize="@dimen/common_btn_text_size" />
                     </LinearLayout>
 
-                    <LinearLayout
+                    <View
                         android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginTop="@dimen/common_spacing_2x"
-                        android:layout_marginBottom="@dimen/common_spacing_2x"
-                        android:gravity="center_vertical"
-                        android:orientation="horizontal"
-                        android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+                        android:layout_height="@dimen/divider_line_space"
+                        android:background="@color/black" />
 
-                        <TextView
-                            android:layout_width="wrap_content"
-                            android:layout_height="wrap_content"
-                            android:text="@string/create_job_name"
-                            android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
+                    <FrameLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:background="@drawable/card_white_bg">
 
-                        <EditText
-                            android:id="@+id/job_name_et"
+                        <androidx.recyclerview.widget.RecyclerView
+                            android:id="@+id/workflow_rv"
                             android:layout_width="match_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_marginLeft="@dimen/common_spacing"
-                            android:background="@drawable/bg_common_input"
-                            android:hint="@string/please_input_job_name"
-                            android:maxLines="1"
-                            android:paddingHorizontal="@dimen/common_spacing"
-                            android:paddingVertical="2dp"
-                            android:singleLine="true"
+                            android:layout_height="match_parent"
+                            android:paddingBottom="@dimen/common_spacing" />
+
+                        <TextView
+                            android:id="@+id/select_workflow_tip"
+                            android:layout_width="match_parent"
+                            android:layout_height="match_parent"
+                            android:background="@drawable/card_white_bg"
+                            android:gravity="center"
+                            android:paddingHorizontal="@dimen/common_spacing_2x"
+                            android:paddingVertical="@dimen/common_spacing"
+                            android:text="@string/please_select_workflow_mode"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/common_text_size" />
-                    </LinearLayout>
+                            android:textSize="@dimen/normal_text_size_18" />
+                    </FrameLayout>
                 </LinearLayout>
             </LinearLayout>
 
@@ -188,9 +261,9 @@
                 <LinearLayout
                     android:id="@+id/point_info_layout"
                     android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
+                    android:layout_height="0dp"
                     android:layout_marginHorizontal="@dimen/common_spacing"
-                    android:layout_marginVertical="@dimen/common_spacing"
+                    android:layout_marginTop="@dimen/common_spacing"
                     android:layout_weight="1"
                     android:background="@drawable/home_card_bg"
                     android:gravity="center_vertical"
@@ -208,7 +281,7 @@
                             android:layout_weight="1"
                             android:text="@string/point_info_title"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <TextView
                             android:id="@+id/select_point_tv"
@@ -239,9 +312,9 @@
                 <LinearLayout
                     android:id="@+id/member_info_layout"
                     android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
+                    android:layout_height="0dp"
                     android:layout_marginHorizontal="@dimen/common_spacing"
-                    android:layout_marginVertical="@dimen/common_spacing"
+                    android:layout_marginTop="@dimen/common_spacing"
                     android:layout_weight="1"
                     android:background="@drawable/home_card_bg"
                     android:gravity="center_vertical"
@@ -259,7 +332,7 @@
                             android:layout_weight="1"
                             android:text="@string/member_info_title"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <TextView
                             android:id="@+id/select_member_tv"
@@ -300,7 +373,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/locker"
                                 android:textColor="@color/black"
-                                android:textSize="@dimen/normal_text_size_24" />
+                                android:textSize="@dimen/normal_text_size_18" />
 
                             <View
                                 android:layout_width="match_parent"
@@ -347,7 +420,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/colocker"
                                 android:textColor="@color/black"
-                                android:textSize="@dimen/normal_text_size_24" />
+                                android:textSize="@dimen/normal_text_size_18" />
 
                             <View
                                 android:layout_width="match_parent"
@@ -370,7 +443,7 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:orientation="horizontal"
-            android:padding="@dimen/common_spacing">
+            android:paddingVertical="@dimen/common_spacing">
 
             <View
                 android:layout_width="0dp"

+ 165 - 92
app/src/main/res/layout-land/fragment_edit_sop.xml

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/edit_sop_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"
@@ -55,121 +55,194 @@
             android:orientation="horizontal">
 
             <LinearLayout
-                android:id="@+id/base_info_layout"
                 android:layout_width="0dp"
                 android:layout_height="match_parent"
                 android:layout_marginHorizontal="@dimen/common_spacing"
-                android:layout_marginTop="@dimen/common_spacing"
-                android:layout_marginBottom="@dimen/common_spacing"
                 android:layout_weight="1"
-                android:background="@drawable/home_card_bg"
                 android:orientation="vertical">
 
-                <TextView
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/common_spacing"
-                    android:text="@string/base_info_title"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/normal_text_size_24" />
-
-                <View
-                    android:layout_width="match_parent"
-                    android:layout_height="@dimen/divider_line_space"
-                    android:background="@color/black" />
-
-
                 <LinearLayout
+                    android:id="@+id/base_info_layout"
                     android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="@dimen/common_spacing_2x"
-                    android:gravity="center_vertical"
-                    android:orientation="horizontal"
-                    android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+                    android:layout_height="0dp"
+                    android:layout_marginTop="@dimen/common_spacing"
+                    android:layout_marginBottom="@dimen/common_spacing"
+                    android:layout_weight="1"
+                    android:background="@drawable/home_card_bg"
+                    android:orientation="vertical">
 
                     <TextView
-                        android:layout_width="wrap_content"
+                        android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:text="@string/sop_workstation"
+                        android:layout_marginLeft="@dimen/common_spacing"
+                        android:text="@string/base_info_title"
                         android:textColor="@color/black"
-                        android:textSize="@dimen/common_text_size" />
+                        android:textSize="@dimen/normal_text_size_18" />
 
-                    <TextView
-                        android:id="@+id/workstation_tv"
+                    <View
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/divider_line_space"
+                        android:background="@color/black" />
+
+
+                    <LinearLayout
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:layout_marginLeft="@dimen/common_spacing"
-                        android:background="@drawable/bg_common_input"
-                        android:drawableRight="@drawable/icon_drop_down"
-                        android:hint="@string/please_select_sop_workstation"
-                        android:maxLines="1"
-                        android:paddingHorizontal="@dimen/common_spacing"
-                        android:paddingVertical="2dp"
-                        android:singleLine="true"
-                        android:textColor="@color/black"
-                        android:textSize="@dimen/common_text_size" />
-                </LinearLayout>
+                        android:layout_marginTop="@dimen/common_spacing"
+                        android:gravity="center_vertical"
+                        android:orientation="horizontal"
+                        android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
 
-                <LinearLayout
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="@dimen/common_spacing_2x"
-                    android:gravity="center_vertical"
-                    android:orientation="horizontal"
-                    android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="@string/sop_workstation"
+                            android:textColor="@color/black"
+                            android:textSize="@dimen/common_text_size" />
 
-                    <TextView
-                        android:layout_width="wrap_content"
+                        <TextView
+                            android:id="@+id/workstation_tv"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginLeft="@dimen/common_spacing"
+                            android:background="@drawable/bg_common_input"
+                            android:drawableRight="@drawable/icon_drop_down"
+                            android:hint="@string/please_select_sop_workstation"
+                            android:maxLines="1"
+                            android:paddingHorizontal="@dimen/common_spacing"
+                            android:paddingVertical="2dp"
+                            android:singleLine="true"
+                            android:textColor="@color/black"
+                            android:textSize="@dimen/common_text_size" />
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:text="@string/flow_mode"
-                        android:textColor="@color/black"
-                        android:textSize="@dimen/common_text_size" />
+                        android:layout_marginTop="@dimen/common_spacing"
+                        android:gravity="center_vertical"
+                        android:orientation="horizontal"
+                        android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
 
-                    <TextView
-                        android:id="@+id/lock_mode_tv"
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="@string/workflow_mode"
+                            android:textColor="@color/black"
+                            android:textSize="@dimen/common_text_size" />
+
+                        <TextView
+                            android:id="@+id/lock_mode_tv"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginLeft="@dimen/common_spacing"
+                            android:background="@drawable/bg_common_input"
+                            android:drawableRight="@drawable/icon_drop_down"
+                            android:hint="@string/please_select_flow_mode"
+                            android:maxLines="1"
+                            android:paddingHorizontal="@dimen/common_spacing"
+                            android:paddingVertical="2dp"
+                            android:singleLine="true"
+                            android:textColor="@color/black"
+                            android:textSize="@dimen/common_text_size" />
+                    </LinearLayout>
+
+                    <LinearLayout
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:layout_marginLeft="@dimen/common_spacing"
-                        android:background="@drawable/bg_common_input"
-                        android:drawableRight="@drawable/icon_drop_down"
-                        android:hint="@string/please_select_flow_mode"
-                        android:maxLines="1"
-                        android:paddingHorizontal="@dimen/common_spacing"
-                        android:paddingVertical="2dp"
-                        android:singleLine="true"
-                        android:textColor="@color/black"
-                        android:textSize="@dimen/common_text_size" />
+                        android:layout_marginTop="@dimen/common_spacing"
+                        android:layout_marginBottom="@dimen/common_spacing"
+                        android:gravity="center_vertical"
+                        android:orientation="horizontal"
+                        android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="@string/create_sop_name"
+                            android:textColor="@color/black"
+                            android:textSize="@dimen/common_text_size" />
+
+                        <EditText
+                            android:id="@+id/sop_name_et"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginLeft="@dimen/common_spacing"
+                            android:background="@drawable/bg_common_input"
+                            android:hint="@string/please_input_sop_name"
+                            android:maxLines="1"
+                            android:paddingHorizontal="@dimen/common_spacing"
+                            android:paddingVertical="2dp"
+                            android:singleLine="true"
+                            android:textColor="@color/black"
+                            android:textSize="@dimen/common_text_size" />
+                    </LinearLayout>
                 </LinearLayout>
 
                 <LinearLayout
+                    android:id="@+id/workflow_mode_layout"
                     android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="@dimen/common_spacing_2x"
-                    android:layout_marginBottom="@dimen/common_spacing_2x"
+                    android:layout_height="0dp"
+                    android:layout_weight="1"
+                    android:background="@drawable/home_card_bg"
                     android:gravity="center_vertical"
-                    android:orientation="horizontal"
-                    android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+                    android:orientation="vertical">
 
-                    <TextView
-                        android:layout_width="wrap_content"
+                    <LinearLayout
+                        android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:text="@string/create_sop_name"
-                        android:textColor="@color/black"
-                        android:textSize="@dimen/common_text_size" />
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginLeft="@dimen/common_spacing"
+                            android:layout_weight="1"
+                            android:text="@string/workflow_mode"
+                            android:textColor="@color/black"
+                            android:textSize="@dimen/normal_text_size_18" />
+
+                        <TextView
+                            android:id="@+id/workflow_mode_setting_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginLeft="@dimen/common_spacing"
+                            android:layout_marginRight="@dimen/common_spacing"
+                            android:background="@drawable/common_btn"
+                            android:paddingHorizontal="@dimen/common_spacing_2x"
+                            android:text="@string/settings"
+                            android:textColor="@color/black"
+                            android:textSize="@dimen/common_btn_text_size" />
+                    </LinearLayout>
 
-                    <EditText
-                        android:id="@+id/sop_name_et"
+                    <View
                         android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginLeft="@dimen/common_spacing"
-                        android:background="@drawable/bg_common_input"
-                        android:hint="@string/please_input_sop_name"
-                        android:maxLines="1"
-                        android:paddingHorizontal="@dimen/common_spacing"
-                        android:paddingVertical="2dp"
-                        android:singleLine="true"
-                        android:textColor="@color/black"
-                        android:textSize="@dimen/common_text_size" />
+                        android:layout_height="@dimen/divider_line_space"
+                        android:background="@color/black" />
+
+                    <FrameLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:background="@drawable/card_white_bg">
+
+                        <androidx.recyclerview.widget.RecyclerView
+                            android:id="@+id/workflow_rv"
+                            android:layout_width="match_parent"
+                            android:layout_height="match_parent"
+                            android:paddingBottom="@dimen/common_spacing" />
+
+                        <TextView
+                            android:id="@+id/select_workflow_tip"
+                            android:layout_width="match_parent"
+                            android:layout_height="match_parent"
+                            android:background="@drawable/card_white_bg"
+                            android:gravity="center"
+                            android:paddingHorizontal="@dimen/common_spacing_2x"
+                            android:paddingVertical="@dimen/common_spacing"
+                            android:text="@string/please_select_workflow_mode"
+                            android:textColor="@color/black"
+                            android:textSize="@dimen/normal_text_size_18" />
+                    </FrameLayout>
                 </LinearLayout>
             </LinearLayout>
 
@@ -184,7 +257,7 @@
                     android:layout_width="match_parent"
                     android:layout_height="0dp"
                     android:layout_marginHorizontal="@dimen/common_spacing"
-                    android:layout_marginVertical="@dimen/common_spacing"
+                    android:layout_marginTop="@dimen/common_spacing"
                     android:layout_weight="1"
                     android:background="@drawable/home_card_bg"
                     android:gravity="center_vertical"
@@ -202,7 +275,7 @@
                             android:layout_weight="1"
                             android:text="@string/point_info_title"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <TextView
                             android:id="@+id/select_point_tv"
@@ -236,7 +309,7 @@
                     android:layout_width="match_parent"
                     android:layout_height="0dp"
                     android:layout_marginHorizontal="@dimen/common_spacing"
-                    android:layout_marginVertical="@dimen/common_spacing"
+                    android:layout_marginTop="@dimen/common_spacing"
                     android:layout_weight="1"
                     android:background="@drawable/home_card_bg"
                     android:gravity="center_vertical"
@@ -254,7 +327,7 @@
                             android:layout_weight="1"
                             android:text="@string/member_info_title"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <TextView
                             android:id="@+id/select_member_tv"
@@ -294,7 +367,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/locker"
                                 android:textColor="@color/black"
-                                android:textSize="@dimen/normal_text_size_24" />
+                                android:textSize="@dimen/normal_text_size_18" />
 
                             <View
                                 android:layout_width="match_parent"
@@ -341,7 +414,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/colocker"
                                 android:textColor="@color/black"
-                                android:textSize="@dimen/normal_text_size_24" />
+                                android:textSize="@dimen/normal_text_size_18" />
 
                             <View
                                 android:layout_width="match_parent"

+ 169 - 95
app/src/main/res/layout-land/fragment_edit_sop_job.xml

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/edit_sop_job_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"
@@ -47,6 +47,7 @@
             android:layout_width="match_parent"
             android:layout_height="@dimen/divider_line_space"
             android:background="@color/black" />
+
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="match_parent"
@@ -54,122 +55,195 @@
             android:orientation="horizontal">
 
             <LinearLayout
-                android:id="@+id/base_info_layout"
                 android:layout_width="0dp"
-                android:layout_weight="1"
                 android:layout_height="match_parent"
                 android:layout_marginHorizontal="@dimen/common_spacing"
-                android:layout_marginTop="@dimen/common_spacing"
-                android:layout_marginBottom="@dimen/common_spacing"
-                android:background="@drawable/home_card_bg"
+                android:layout_weight="1"
                 android:orientation="vertical">
 
-                <TextView
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/common_spacing"
-                    android:text="@string/base_info_title"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/normal_text_size_24" />
-
-                <View
-                    android:layout_width="match_parent"
-                    android:layout_height="@dimen/divider_line_space"
-                    android:background="@color/black" />
-
-
                 <LinearLayout
+                    android:id="@+id/base_info_layout"
                     android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="@dimen/common_spacing_2x"
-                    android:gravity="center_vertical"
-                    android:orientation="horizontal"
-                    android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+                    android:layout_height="0dp"
+                    android:layout_marginTop="@dimen/common_spacing"
+                    android:layout_marginBottom="@dimen/common_spacing"
+                    android:layout_weight="1"
+                    android:background="@drawable/home_card_bg"
+                    android:orientation="vertical">
 
                     <TextView
-                        android:layout_width="wrap_content"
+                        android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:text="@string/sop_workstation"
+                        android:layout_marginLeft="@dimen/common_spacing"
+                        android:text="@string/base_info_title"
                         android:textColor="@color/black"
-                        android:textSize="@dimen/common_text_size" />
+                        android:textSize="@dimen/normal_text_size_18" />
 
-                    <TextView
-                        android:id="@+id/workstation_tv"
+                    <View
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/divider_line_space"
+                        android:background="@color/black" />
+
+
+                    <LinearLayout
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:layout_marginLeft="@dimen/common_spacing"
-                        android:background="@drawable/bg_common_input"
-                        android:drawableRight="@drawable/icon_drop_down"
-                        android:hint="@string/please_select_sop_workstation"
-                        android:maxLines="1"
-                        android:paddingHorizontal="@dimen/common_spacing"
-                        android:paddingVertical="2dp"
-                        android:singleLine="true"
-                        android:textColor="@color/black"
-                        android:textSize="@dimen/common_text_size" />
-                </LinearLayout>
+                        android:layout_marginTop="@dimen/common_spacing"
+                        android:gravity="center_vertical"
+                        android:orientation="horizontal"
+                        android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
 
-                <LinearLayout
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginLeft="36dp"
-                    android:layout_marginTop="@dimen/common_spacing_2x"
-                    android:gravity="center_vertical"
-                    android:orientation="horizontal"
-                    android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="@string/sop_workstation"
+                            android:textColor="@color/black"
+                            android:textSize="@dimen/common_text_size" />
 
-                    <TextView
-                        android:layout_width="wrap_content"
+                        <TextView
+                            android:id="@+id/workstation_tv"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginLeft="@dimen/common_spacing"
+                            android:background="@drawable/bg_common_input"
+                            android:drawableRight="@drawable/icon_drop_down"
+                            android:hint="@string/please_select_sop_workstation"
+                            android:maxLines="1"
+                            android:paddingHorizontal="@dimen/common_spacing"
+                            android:paddingVertical="2dp"
+                            android:singleLine="true"
+                            android:textColor="@color/black"
+                            android:textSize="@dimen/common_text_size" />
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:text="@string/create_sop_job_sop"
-                        android:textColor="@color/black"
-                        android:textSize="@dimen/common_text_size" />
+                        android:layout_marginLeft="36dp"
+                        android:layout_marginTop="@dimen/common_spacing"
+                        android:gravity="center_vertical"
+                        android:orientation="horizontal"
+                        android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
 
-                    <TextView
-                        android:id="@+id/sop_tv"
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="@string/create_sop_job_sop"
+                            android:textColor="@color/black"
+                            android:textSize="@dimen/common_text_size" />
+
+                        <TextView
+                            android:id="@+id/sop_tv"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginLeft="@dimen/common_spacing"
+                            android:background="@drawable/bg_common_input"
+                            android:drawableRight="@drawable/icon_drop_down"
+                            android:hint="@string/please_select_sop"
+                            android:maxLines="1"
+                            android:paddingHorizontal="@dimen/common_spacing"
+                            android:paddingVertical="2dp"
+                            android:singleLine="true"
+                            android:textColor="@color/black"
+                            android:textSize="@dimen/common_text_size" />
+                    </LinearLayout>
+
+                    <LinearLayout
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:layout_marginLeft="@dimen/common_spacing"
-                        android:background="@drawable/bg_common_input"
-                        android:drawableRight="@drawable/icon_drop_down"
-                        android:hint="@string/please_select_sop"
-                        android:maxLines="1"
-                        android:paddingHorizontal="@dimen/common_spacing"
-                        android:paddingVertical="2dp"
-                        android:singleLine="true"
-                        android:textColor="@color/black"
-                        android:textSize="@dimen/common_text_size" />
+                        android:layout_marginTop="@dimen/common_spacing"
+                        android:layout_marginBottom="@dimen/common_spacing"
+                        android:gravity="center_vertical"
+                        android:orientation="horizontal"
+                        android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="@string/job_name"
+                            android:textColor="@color/black"
+                            android:textSize="@dimen/common_text_size" />
+
+                        <EditText
+                            android:id="@+id/job_name_et"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginLeft="@dimen/common_spacing"
+                            android:background="@drawable/bg_common_input"
+                            android:hint="@string/please_input_job_name"
+                            android:maxLines="1"
+                            android:paddingHorizontal="@dimen/common_spacing"
+                            android:paddingVertical="2dp"
+                            android:singleLine="true"
+                            android:textColor="@color/black"
+                            android:textSize="@dimen/common_text_size" />
+                    </LinearLayout>
                 </LinearLayout>
 
                 <LinearLayout
+                    android:id="@+id/workflow_mode_layout"
                     android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="@dimen/common_spacing_2x"
-                    android:layout_marginBottom="@dimen/common_spacing_2x"
+                    android:layout_height="0dp"
+                    android:layout_weight="1"
+                    android:background="@drawable/home_card_bg"
                     android:gravity="center_vertical"
-                    android:orientation="horizontal"
-                    android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+                    android:orientation="vertical">
 
-                    <TextView
-                        android:layout_width="wrap_content"
+                    <LinearLayout
+                        android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:text="@string/job_name"
-                        android:textColor="@color/black"
-                        android:textSize="@dimen/common_text_size" />
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginLeft="@dimen/common_spacing"
+                            android:layout_weight="1"
+                            android:text="@string/workflow_mode"
+                            android:textColor="@color/black"
+                            android:textSize="@dimen/normal_text_size_18" />
 
-                    <EditText
-                        android:id="@+id/job_name_et"
+                        <TextView
+                            android:id="@+id/workflow_mode_setting_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginLeft="@dimen/common_spacing"
+                            android:layout_marginRight="@dimen/common_spacing"
+                            android:background="@drawable/common_btn"
+                            android:paddingHorizontal="@dimen/common_spacing_2x"
+                            android:text="@string/settings"
+                            android:textColor="@color/black"
+                            android:textSize="@dimen/common_btn_text_size" />
+                    </LinearLayout>
+
+                    <View
                         android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginLeft="@dimen/common_spacing"
-                        android:background="@drawable/bg_common_input"
-                        android:hint="@string/please_input_job_name"
-                        android:maxLines="1"
-                        android:paddingHorizontal="@dimen/common_spacing"
-                        android:paddingVertical="2dp"
-                        android:singleLine="true"
-                        android:textColor="@color/black"
-                        android:textSize="@dimen/common_text_size" />
+                        android:layout_height="@dimen/divider_line_space"
+                        android:background="@color/black" />
+
+                    <FrameLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:background="@drawable/card_white_bg">
+
+                        <androidx.recyclerview.widget.RecyclerView
+                            android:id="@+id/workflow_rv"
+                            android:layout_width="match_parent"
+                            android:layout_height="match_parent"
+                            android:paddingBottom="@dimen/common_spacing" />
+
+                        <TextView
+                            android:id="@+id/select_workflow_tip"
+                            android:layout_width="match_parent"
+                            android:layout_height="match_parent"
+                            android:background="@drawable/card_white_bg"
+                            android:gravity="center"
+                            android:paddingHorizontal="@dimen/common_spacing_2x"
+                            android:paddingVertical="@dimen/common_spacing"
+                            android:text="@string/please_select_workflow_mode"
+                            android:textColor="@color/black"
+                            android:textSize="@dimen/normal_text_size_18" />
+                    </FrameLayout>
                 </LinearLayout>
             </LinearLayout>
 
@@ -184,7 +258,7 @@
                     android:layout_width="match_parent"
                     android:layout_height="0dp"
                     android:layout_marginHorizontal="@dimen/common_spacing"
-                    android:layout_marginVertical="@dimen/common_spacing"
+                    android:layout_marginTop="@dimen/common_spacing"
                     android:layout_weight="1"
                     android:background="@drawable/home_card_bg"
                     android:gravity="center_vertical"
@@ -201,7 +275,7 @@
                             android:layout_marginLeft="@dimen/common_spacing"
                             android:text="@string/point_info_title"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                     </LinearLayout>
 
@@ -223,7 +297,7 @@
                     android:layout_width="match_parent"
                     android:layout_height="0dp"
                     android:layout_marginHorizontal="@dimen/common_spacing"
-                    android:layout_marginVertical="@dimen/common_spacing"
+                    android:layout_marginTop="@dimen/common_spacing"
                     android:layout_weight="1"
                     android:background="@drawable/home_card_bg"
                     android:gravity="center_vertical"
@@ -241,7 +315,7 @@
                             android:layout_weight="1"
                             android:text="@string/member_info_title"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <TextView
                             android:id="@+id/select_member_tv"
@@ -281,7 +355,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/locker"
                                 android:textColor="@color/black"
-                                android:textSize="@dimen/normal_text_size_24" />
+                                android:textSize="@dimen/normal_text_size_18" />
 
                             <View
                                 android:layout_width="match_parent"
@@ -328,7 +402,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/colocker"
                                 android:textColor="@color/black"
-                                android:textSize="@dimen/normal_text_size_24" />
+                                android:textSize="@dimen/normal_text_size_18" />
 
                             <View
                                 android:layout_width="match_parent"
@@ -351,7 +425,7 @@
             android:layout_height="wrap_content"
             android:gravity="right"
             android:orientation="horizontal"
-            android:padding="@dimen/common_spacing">
+            android:paddingVertical="@dimen/common_spacing">
 
             <TextView
                 android:id="@+id/save_and_execute"

+ 3 - 3
app/src/main/res/layout-land/fragment_home.xml

@@ -59,7 +59,7 @@
                     android:paddingLeft="@dimen/common_spacing"
                     android:text="@string/home_realtime_data_title"
                     android:textColor="@color/white"
-                    android:textSize="@dimen/normal_text_size_24" />
+                    android:textSize="@dimen/normal_text_size_18" />
 
                 <LinearLayout
                     android:id="@+id/realtime_data_filter_layout"
@@ -104,7 +104,7 @@
                         <TextView
                             android:layout_width="wrap_content"
                             android:layout_height="wrap_content"
-                            android:text="@string/flow_mode"
+                            android:text="@string/workflow_mode"
                             android:textColor="@color/black"
                             android:textSize="22sp" />
 
@@ -246,7 +246,7 @@
                     android:paddingLeft="@dimen/common_spacing"
                     android:text="@string/home_overview_data_title"
                     android:textColor="@color/white"
-                    android:textSize="@dimen/normal_text_size_24" />
+                    android:textSize="@dimen/normal_text_size_18" />
 
                 <LinearLayout
                     android:id="@+id/overview_data_filter_layout"

+ 1 - 1
app/src/main/res/layout-land/fragment_job_execute.xml

@@ -31,7 +31,7 @@
                 android:layout_weight="1"
                 android:text="@string/job_manage_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"

+ 1 - 1
app/src/main/res/layout-land/fragment_point_manage.xml

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/point_manage_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"

+ 4 - 4
app/src/main/res/layout-land/fragment_select_memeber.xml

@@ -30,7 +30,7 @@
                 android:layout_marginLeft="@dimen/common_spacing"
                 android:text="@string/create_sop_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <ImageView
                 android:layout_width="wrap_content"
@@ -48,7 +48,7 @@
                 android:layout_marginLeft="@dimen/common_spacing"
                 android:text="@string/select_member_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <View
                 android:layout_width="0dp"
@@ -110,7 +110,7 @@
                             android:paddingVertical="@dimen/common_spacing"
                             android:text="@string/locker"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <TextView
                             android:id="@+id/select_locker_tv"
@@ -154,7 +154,7 @@
                             android:paddingVertical="@dimen/common_spacing"
                             android:text="@string/colocker"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <TextView
                             android:id="@+id/select_colocker_tv"

+ 4 - 4
app/src/main/res/layout-land/fragment_select_point.xml

@@ -30,7 +30,7 @@
                 android:layout_marginLeft="@dimen/common_spacing"
                 android:text="@string/create_sop_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <ImageView
                 android:layout_width="wrap_content"
@@ -48,7 +48,7 @@
                 android:layout_marginLeft="@dimen/common_spacing"
                 android:text="@string/select_point_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <View
                 android:layout_width="0dp"
@@ -95,7 +95,7 @@
                     android:layout_marginLeft="@dimen/common_spacing"
                     android:text="@string/selected_point_info_title"
                     android:textColor="@color/black"
-                    android:textSize="@dimen/normal_text_size_24" />
+                    android:textSize="@dimen/normal_text_size_18" />
 
                 <View
                     android:layout_width="match_parent"
@@ -127,7 +127,7 @@
                     android:layout_marginLeft="@dimen/common_spacing"
                     android:text="@string/unselected_point_info_title"
                     android:textColor="@color/black"
-                    android:textSize="@dimen/normal_text_size_24" />
+                    android:textSize="@dimen/normal_text_size_18" />
 
                 <View
                     android:layout_width="match_parent"

+ 51 - 0
app/src/main/res/layout-land/item_job_workflow_step.xml

@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:gravity="center"
+        android:orientation="horizontal">
+
+        <LinearLayout
+            android:id="@+id/step_layout"
+            android:layout_width="wrap_content"
+            android:layout_height="@dimen/workflow_step_item_height"
+            android:layout_marginLeft="@dimen/common_spacing"
+            android:background="@drawable/bg_job_execute_step"
+            android:gravity="center"
+            android:minWidth="@dimen/workflow_step_item_width"
+            android:orientation="vertical">
+
+            <TextView
+                android:id="@+id/step_name_tv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/common_spacing"
+                android:gravity="center"
+                android:text="@string/point_name_tv"
+                android:textSize="@dimen/common_text_size" />
+
+            <TextView
+                android:id="@+id/step_index_tv"
+                android:layout_width="@dimen/workflow_step_item_index_size"
+                android:layout_height="@dimen/workflow_step_item_index_size"
+                android:layout_marginTop="@dimen/common_spacing"
+                android:background="@drawable/bg_job_execute_step_index"
+                android:gravity="center"
+                android:includeFontPadding="false"
+                android:padding="@dimen/common_spacing_small"
+                android:textSize="@dimen/common_text_size"
+                tools:text="1" />
+        </LinearLayout>
+
+        <ImageView
+            android:id="@+id/divider_iv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/common_spacing"
+            android:src="@drawable/icon_job_execute_arrow_right" />
+    </LinearLayout>
+
+</layout>

+ 160 - 135
app/src/main/res/layout/dialog_add_user.xml

@@ -1,5 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<layout xmlns:android="http://schemas.android.com/apk/res/android">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools">
 
     <LinearLayout
         android:layout_width="@dimen/dialog_common_root_width"
@@ -37,170 +39,193 @@
             android:layout_height="@dimen/divider_line_space"
             android:background="@color/black" />
 
-        <LinearLayout
+        <androidx.constraintlayout.widget.ConstraintLayout
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:layout_weight="1"
-            android:orientation="vertical">
+            android:orientation="vertical"
+            android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
 
-            <LinearLayout
-                android:layout_width="match_parent"
+            <TextView
+                android:id="@+id/username_tv"
+                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="@dimen/common_spacing_2x"
-                android:gravity="center_vertical"
-                android:orientation="horizontal"
-                android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
-
-                <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:text="@string/nickname"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/common_text_size" />
+                android:text="@string/user_name"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
 
-                <EditText
-                    android:id="@+id/nickname_et"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/common_spacing"
-                    android:background="@drawable/bg_common_input"
-                    android:hint="@string/please_input_nickname"
-                    android:maxLines="1"
-                    android:paddingHorizontal="@dimen/common_spacing"
-                    android:paddingVertical="2dp"
-                    android:singleLine="true"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/common_text_size" />
-            </LinearLayout>
+            <EditText
+                android:id="@+id/username_et"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/common_spacing"
+                android:background="@drawable/bg_common_input"
+                android:hint="@string/please_input_username"
+                android:maxLines="1"
+                android:paddingHorizontal="@dimen/common_spacing"
+                android:paddingVertical="2dp"
+                android:singleLine="true"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size"
+                app:layout_constraintBottom_toBottomOf="@+id/username_tv"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toEndOf="@+id/username_tv" />
 
-            <LinearLayout
-                android:layout_width="match_parent"
+            <TextView
+                android:id="@+id/nickname_tv"
+                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="@dimen/common_spacing_2x"
-                android:gravity="center_vertical"
-                android:orientation="horizontal"
-                android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
-
-                <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:text="@string/user_manage_card_code"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/common_text_size" />
+                android:text="@string/nickname"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size"
+                app:layout_constraintEnd_toEndOf="@+id/username_tv"
+                app:layout_constraintTop_toBottomOf="@+id/username_tv" />
 
-                <EditText
-                    android:id="@+id/cardcode_et"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/common_spacing"
-                    android:background="@drawable/bg_common_input"
-                    android:hint="@string/please_input_card_code"
-                    android:maxLines="1"
-                    android:paddingHorizontal="@dimen/common_spacing"
-                    android:paddingVertical="2dp"
-                    android:singleLine="true"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/common_text_size" />
-            </LinearLayout>
+            <EditText
+                android:id="@+id/nickname_et"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/common_spacing"
+                android:background="@drawable/bg_common_input"
+                android:hint="@string/please_input_nickname"
+                android:maxLines="1"
+                android:paddingHorizontal="@dimen/common_spacing"
+                android:paddingVertical="2dp"
+                android:singleLine="true"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size"
+                app:layout_constraintBottom_toBottomOf="@+id/nickname_tv"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toEndOf="@+id/nickname_tv"
+                app:layout_constraintTop_toTopOf="@+id/nickname_tv" />
 
-            <LinearLayout
-                android:layout_width="match_parent"
+            <TextView
+                android:id="@+id/card_code_tv"
+                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="@dimen/common_spacing_2x"
-                android:gravity="center_vertical"
-                android:orientation="horizontal"
-                android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
-
-                <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:text="@string/user_manage_role"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/common_text_size" />
+                android:text="@string/user_manage_card_code"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size"
+                app:layout_constraintEnd_toEndOf="@+id/nickname_tv"
+                app:layout_constraintTop_toBottomOf="@+id/nickname_tv" />
 
-                <TextView
-                    android:id="@+id/role_tv"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/common_spacing"
-                    android:background="@drawable/bg_common_input"
-                    android:drawableRight="@drawable/icon_drop_down"
-                    android:hint="@string/please_select_role"
-                    android:paddingHorizontal="@dimen/common_spacing"
-                    android:paddingVertical="2dp"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/common_text_size" />
-            </LinearLayout>
+            <EditText
+                android:id="@+id/cardcode_et"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/common_spacing"
+                android:background="@drawable/bg_common_input"
+                android:hint="@string/please_input_card_code"
+                android:maxLines="1"
+                android:paddingHorizontal="@dimen/common_spacing"
+                android:paddingVertical="2dp"
+                android:singleLine="true"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size"
+                app:layout_constraintBottom_toBottomOf="@+id/card_code_tv"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toEndOf="@+id/card_code_tv"
+                app:layout_constraintTop_toTopOf="@+id/card_code_tv" />
 
-            <LinearLayout
-                android:id="@+id/workstation_layout"
-                android:layout_width="match_parent"
+            <TextView
+                android:id="@+id/role_title_tv"
+                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="@dimen/common_spacing_2x"
-                android:gravity="center_vertical"
-                android:orientation="horizontal"
-                android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+                android:text="@string/user_manage_role"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size"
+                app:layout_constraintEnd_toEndOf="@+id/card_code_tv"
+                app:layout_constraintTop_toBottomOf="@+id/card_code_tv" />
 
-                <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:text="@string/user_manage_area"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/common_text_size" />
+            <TextView
+                android:id="@+id/role_tv"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/common_spacing"
+                android:background="@drawable/bg_common_input"
+                android:drawableRight="@drawable/icon_drop_down"
+                android:hint="@string/please_select_role"
+                android:paddingHorizontal="@dimen/common_spacing"
+                android:paddingVertical="2dp"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size"
+                app:layout_constraintBottom_toBottomOf="@+id/role_title_tv"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toEndOf="@+id/role_title_tv"
+                app:layout_constraintTop_toTopOf="@+id/role_title_tv" />
 
-                <TextView
-                    android:id="@+id/workstation_name_tv"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/common_spacing"
-                    android:background="@drawable/bg_common_input"
-                    android:drawableRight="@drawable/icon_drop_down"
-                    android:hint="@string/please_select_area"
-                    android:paddingHorizontal="@dimen/common_spacing"
-                    android:paddingVertical="2dp"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/common_text_size" />
-            </LinearLayout>
+            <TextView
+                android:id="@+id/workstation_tv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/common_spacing_2x"
+                android:text="@string/user_manage_area"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size"
+                app:layout_constraintEnd_toEndOf="@+id/role_title_tv"
+                app:layout_constraintTop_toBottomOf="@+id/role_title_tv" />
 
-            <LinearLayout
-                android:layout_width="match_parent"
+            <TextView
+                android:id="@+id/workstation_name_tv"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/common_spacing"
+                android:background="@drawable/bg_common_input"
+                android:drawableRight="@drawable/icon_drop_down"
+                android:hint="@string/please_select_area"
+                android:paddingHorizontal="@dimen/common_spacing"
+                android:paddingVertical="2dp"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size"
+                app:layout_constraintBottom_toBottomOf="@+id/workstation_tv"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toEndOf="@+id/workstation_tv"
+                app:layout_constraintTop_toTopOf="@+id/workstation_tv" />
+
+            <TextView
+                android:id="@+id/status_tv"
+                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="@dimen/common_spacing_2x"
-                android:gravity="center_vertical"
+                android:text="@string/manage_filter_status"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size"
+                app:layout_constraintEnd_toEndOf="@+id/workstation_tv"
+                app:layout_constraintTop_toBottomOf="@+id/workstation_tv" />
+
+            <RadioGroup
+                android:id="@+id/status_rg"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/common_spacing"
                 android:orientation="horizontal"
-                android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+                app:layout_constraintBottom_toBottomOf="@+id/status_tv"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toEndOf="@+id/status_tv"
+                app:layout_constraintTop_toTopOf="@+id/status_tv">
 
-                <TextView
+                <RadioButton
+                    android:id="@+id/activate_rb"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:text="@string/manage_filter_status"
-                    android:textColor="@color/black"
+                    android:text="@string/user_manage_filter_activate"
                     android:textSize="@dimen/common_text_size" />
 
-                <RadioGroup
-                    android:id="@+id/status_rg"
-                    android:layout_width="match_parent"
+                <RadioButton
+                    android:id="@+id/deactivate_rb"
+                    android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:orientation="horizontal">
-
-                    <RadioButton
-                        android:id="@+id/activate_rb"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:layout_marginLeft="@dimen/common_spacing"
-                        android:text="@string/user_manage_filter_activate"
-                        android:textSize="@dimen/common_text_size" />
-
-                    <RadioButton
-                        android:id="@+id/deactivate_rb"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:layout_marginLeft="@dimen/common_spacing"
-                        android:text="@string/user_manage_filter_deactivate"
-                        android:textSize="@dimen/common_text_size" />
-                </RadioGroup>
-            </LinearLayout>
-        </LinearLayout>
+                    android:layout_marginLeft="@dimen/common_spacing"
+                    android:text="@string/user_manage_filter_deactivate"
+                    android:textSize="@dimen/common_text_size" />
+            </RadioGroup>
+        </androidx.constraintlayout.widget.ConstraintLayout>
 
         <LinearLayout
             android:layout_width="match_parent"

+ 159 - 135
app/src/main/res/layout/dialog_update_user.xml

@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<layout xmlns:android="http://schemas.android.com/apk/res/android">
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
 
     <LinearLayout
         android:layout_width="@dimen/dialog_common_root_width"
@@ -37,170 +38,193 @@
             android:layout_height="@dimen/divider_line_space"
             android:background="@color/black" />
 
-        <LinearLayout
+        <androidx.constraintlayout.widget.ConstraintLayout
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:layout_weight="1"
-            android:orientation="vertical">
+            android:orientation="vertical"
+            android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
 
-            <LinearLayout
-                android:layout_width="match_parent"
+            <TextView
+                android:id="@+id/username_tv"
+                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="@dimen/common_spacing_2x"
-                android:gravity="center_vertical"
-                android:orientation="horizontal"
-                android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
-
-                <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:text="@string/nickname"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/common_text_size" />
+                android:text="@string/user_name"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
 
-                <EditText
-                    android:id="@+id/nickname_et"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/common_spacing"
-                    android:background="@drawable/bg_common_input"
-                    android:hint="@string/please_input_nickname"
-                    android:maxLines="1"
-                    android:paddingHorizontal="@dimen/common_spacing"
-                    android:paddingVertical="2dp"
-                    android:singleLine="true"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/common_text_size" />
-            </LinearLayout>
+            <EditText
+                android:id="@+id/username_et"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/common_spacing"
+                android:background="@drawable/bg_common_input"
+                android:hint="@string/please_input_username"
+                android:maxLines="1"
+                android:paddingHorizontal="@dimen/common_spacing"
+                android:paddingVertical="2dp"
+                android:singleLine="true"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size"
+                app:layout_constraintBottom_toBottomOf="@+id/username_tv"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toEndOf="@+id/username_tv" />
 
-            <LinearLayout
-                android:layout_width="match_parent"
+            <TextView
+                android:id="@+id/nickname_tv"
+                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="@dimen/common_spacing_2x"
-                android:gravity="center_vertical"
-                android:orientation="horizontal"
-                android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
-
-                <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:text="@string/user_manage_card_code"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/common_text_size" />
+                android:text="@string/nickname"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size"
+                app:layout_constraintEnd_toEndOf="@+id/username_tv"
+                app:layout_constraintTop_toBottomOf="@+id/username_tv" />
 
-                <EditText
-                    android:id="@+id/cardcode_et"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/common_spacing"
-                    android:background="@drawable/bg_common_input"
-                    android:hint="@string/please_input_card_code"
-                    android:maxLines="1"
-                    android:paddingHorizontal="@dimen/common_spacing"
-                    android:paddingVertical="2dp"
-                    android:singleLine="true"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/common_text_size" />
-            </LinearLayout>
+            <EditText
+                android:id="@+id/nickname_et"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/common_spacing"
+                android:background="@drawable/bg_common_input"
+                android:hint="@string/please_input_nickname"
+                android:maxLines="1"
+                android:paddingHorizontal="@dimen/common_spacing"
+                android:paddingVertical="2dp"
+                android:singleLine="true"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size"
+                app:layout_constraintBottom_toBottomOf="@+id/nickname_tv"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toEndOf="@+id/nickname_tv"
+                app:layout_constraintTop_toTopOf="@+id/nickname_tv" />
 
-            <LinearLayout
-                android:layout_width="match_parent"
+            <TextView
+                android:id="@+id/card_code_tv"
+                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="@dimen/common_spacing_2x"
-                android:gravity="center_vertical"
-                android:orientation="horizontal"
-                android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
-
-                <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:text="@string/user_manage_role"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/common_text_size" />
+                android:text="@string/user_manage_card_code"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size"
+                app:layout_constraintEnd_toEndOf="@+id/nickname_tv"
+                app:layout_constraintTop_toBottomOf="@+id/nickname_tv" />
 
-                <TextView
-                    android:id="@+id/role_tv"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/common_spacing"
-                    android:background="@drawable/bg_common_input"
-                    android:drawableRight="@drawable/icon_drop_down"
-                    android:hint="@string/please_select_role"
-                    android:paddingHorizontal="@dimen/common_spacing"
-                    android:paddingVertical="2dp"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/common_text_size" />
-            </LinearLayout>
+            <EditText
+                android:id="@+id/cardcode_et"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/common_spacing"
+                android:background="@drawable/bg_common_input"
+                android:hint="@string/please_input_card_code"
+                android:maxLines="1"
+                android:paddingHorizontal="@dimen/common_spacing"
+                android:paddingVertical="2dp"
+                android:singleLine="true"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size"
+                app:layout_constraintBottom_toBottomOf="@+id/card_code_tv"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toEndOf="@+id/card_code_tv"
+                app:layout_constraintTop_toTopOf="@+id/card_code_tv" />
 
-            <LinearLayout
-                android:id="@+id/workstation_layout"
-                android:layout_width="match_parent"
+            <TextView
+                android:id="@+id/role_title_tv"
+                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="@dimen/common_spacing_2x"
-                android:gravity="center_vertical"
-                android:orientation="horizontal"
-                android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+                android:text="@string/user_manage_role"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size"
+                app:layout_constraintEnd_toEndOf="@+id/card_code_tv"
+                app:layout_constraintTop_toBottomOf="@+id/card_code_tv" />
 
-                <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:text="@string/user_manage_area"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/common_text_size" />
+            <TextView
+                android:id="@+id/role_tv"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/common_spacing"
+                android:background="@drawable/bg_common_input"
+                android:drawableRight="@drawable/icon_drop_down"
+                android:hint="@string/please_select_role"
+                android:paddingHorizontal="@dimen/common_spacing"
+                android:paddingVertical="2dp"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size"
+                app:layout_constraintBottom_toBottomOf="@+id/role_title_tv"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toEndOf="@+id/role_title_tv"
+                app:layout_constraintTop_toTopOf="@+id/role_title_tv" />
 
-                <TextView
-                    android:id="@+id/workstation_name_tv"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/common_spacing"
-                    android:background="@drawable/bg_common_input"
-                    android:drawableRight="@drawable/icon_drop_down"
-                    android:hint="@string/please_select_area"
-                    android:paddingHorizontal="@dimen/common_spacing"
-                    android:paddingVertical="2dp"
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/common_text_size" />
-            </LinearLayout>
+            <TextView
+                android:id="@+id/workstation_tv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/common_spacing_2x"
+                android:text="@string/user_manage_area"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size"
+                app:layout_constraintEnd_toEndOf="@+id/role_title_tv"
+                app:layout_constraintTop_toBottomOf="@+id/role_title_tv" />
 
-            <LinearLayout
-                android:layout_width="match_parent"
+            <TextView
+                android:id="@+id/workstation_name_tv"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/common_spacing"
+                android:background="@drawable/bg_common_input"
+                android:drawableRight="@drawable/icon_drop_down"
+                android:hint="@string/please_select_area"
+                android:paddingHorizontal="@dimen/common_spacing"
+                android:paddingVertical="2dp"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size"
+                app:layout_constraintBottom_toBottomOf="@+id/workstation_tv"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toEndOf="@+id/workstation_tv"
+                app:layout_constraintTop_toTopOf="@+id/workstation_tv" />
+
+            <TextView
+                android:id="@+id/status_tv"
+                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="@dimen/common_spacing_2x"
-                android:gravity="center_vertical"
+                android:text="@string/manage_filter_status"
+                android:textColor="@color/black"
+                android:textSize="@dimen/common_text_size"
+                app:layout_constraintEnd_toEndOf="@+id/workstation_tv"
+                app:layout_constraintTop_toBottomOf="@+id/workstation_tv" />
+
+            <RadioGroup
+                android:id="@+id/status_rg"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/common_spacing"
                 android:orientation="horizontal"
-                android:paddingHorizontal="@dimen/dialog_content_normal_padding_horizontal">
+                app:layout_constraintBottom_toBottomOf="@+id/status_tv"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toEndOf="@+id/status_tv"
+                app:layout_constraintTop_toTopOf="@+id/status_tv">
 
-                <TextView
+                <RadioButton
+                    android:id="@+id/activate_rb"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:text="@string/manage_filter_status"
-                    android:textColor="@color/black"
+                    android:text="@string/user_manage_filter_activate"
                     android:textSize="@dimen/common_text_size" />
 
-                <RadioGroup
-                    android:id="@+id/status_rg"
-                    android:layout_width="match_parent"
+                <RadioButton
+                    android:id="@+id/deactivate_rb"
+                    android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:orientation="horizontal">
-
-                    <RadioButton
-                        android:id="@+id/activate_rb"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:layout_marginLeft="@dimen/common_spacing"
-                        android:textSize="@dimen/common_text_size"
-                        android:text="@string/user_manage_filter_activate" />
-
-                    <RadioButton
-                        android:id="@+id/deactivate_rb"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:layout_marginLeft="@dimen/common_spacing"
-                        android:textSize="@dimen/common_text_size"
-                        android:text="@string/user_manage_filter_deactivate" />
-                </RadioGroup>
-            </LinearLayout>
-        </LinearLayout>
+                    android:layout_marginLeft="@dimen/common_spacing"
+                    android:text="@string/user_manage_filter_deactivate"
+                    android:textSize="@dimen/common_text_size" />
+            </RadioGroup>
+        </androidx.constraintlayout.widget.ConstraintLayout>
 
         <LinearLayout
             android:layout_width="match_parent"

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

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/card_manage_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"

+ 81 - 13
app/src/main/res/layout/fragment_create_job.xml

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/create_job_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"
@@ -37,8 +37,8 @@
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="@dimen/common_spacing"
                 android:background="@drawable/common_btn"
-                android:text="@string/back"
                 android:paddingHorizontal="@dimen/common_spacing_2x"
+                android:text="@string/back"
                 android:textColor="@color/black"
                 android:textSize="@dimen/common_btn_text_size" />
         </LinearLayout>
@@ -66,7 +66,7 @@
                 android:layout_weight="1"
                 android:text="@string/base_info_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <View
                 android:layout_width="match_parent"
@@ -116,7 +116,7 @@
                 <TextView
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:text="@string/flow_mode"
+                    android:text="@string/workflow_mode"
                     android:textColor="@color/black"
                     android:textSize="@dimen/common_text_size" />
 
@@ -174,6 +174,74 @@
             android:layout_weight="1"
             android:orientation="vertical">
 
+            <LinearLayout
+                android:id="@+id/workflow_mode_layout"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_marginHorizontal="@dimen/common_spacing_2x"
+                android:layout_marginVertical="@dimen/common_spacing"
+                android:layout_weight="1"
+                android:background="@drawable/home_card_bg"
+                android:gravity="center_vertical"
+                android:orientation="vertical">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:orientation="horizontal">
+
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="@dimen/common_spacing"
+                        android:layout_weight="1"
+                        android:text="@string/workflow_mode"
+                        android:textColor="@color/black"
+                        android:textSize="@dimen/normal_text_size_18" />
+
+                    <TextView
+                        android:id="@+id/workflow_mode_setting_tv"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="@dimen/common_spacing"
+                        android:layout_marginRight="@dimen/common_spacing"
+                        android:background="@drawable/common_btn"
+                        android:paddingHorizontal="@dimen/common_spacing_2x"
+                        android:text="@string/settings"
+                        android:textColor="@color/black"
+                        android:textSize="@dimen/common_btn_text_size" />
+                </LinearLayout>
+
+                <View
+                    android:layout_width="match_parent"
+                    android:layout_height="@dimen/divider_line_space"
+                    android:background="@color/black" />
+
+                <FrameLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:background="@drawable/card_white_bg">
+
+                    <androidx.recyclerview.widget.RecyclerView
+                        android:id="@+id/workflow_rv"
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:paddingBottom="@dimen/common_spacing" />
+
+                    <TextView
+                        android:id="@+id/select_workflow_tip"
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:background="@drawable/card_white_bg"
+                        android:gravity="center"
+                        android:paddingHorizontal="@dimen/common_spacing_2x"
+                        android:paddingVertical="@dimen/common_spacing"
+                        android:text="@string/please_select_workflow_mode"
+                        android:textColor="@color/black"
+                        android:textSize="@dimen/normal_text_size_18" />
+                </FrameLayout>
+            </LinearLayout>
+
             <LinearLayout
                 android:id="@+id/point_info_layout"
                 android:layout_width="match_parent"
@@ -197,7 +265,7 @@
                         android:layout_weight="1"
                         android:text="@string/point_info_title"
                         android:textColor="@color/black"
-                        android:textSize="@dimen/normal_text_size_24" />
+                        android:textSize="@dimen/normal_text_size_18" />
 
                     <TextView
                         android:id="@+id/select_point_tv"
@@ -224,7 +292,7 @@
                     <androidx.recyclerview.widget.RecyclerView
                         android:id="@+id/point_rv"
                         android:layout_width="match_parent"
-                        android:layout_height="240dp"
+                        android:layout_height="match_parent"
                         android:paddingBottom="@dimen/common_spacing" />
 
                     <LinearLayout
@@ -248,10 +316,9 @@
                             android:paddingVertical="@dimen/common_spacing"
                             android:text="@string/please_must_select_at_least_one_point"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
                     </LinearLayout>
                 </FrameLayout>
-
             </LinearLayout>
 
             <LinearLayout
@@ -277,7 +344,7 @@
                         android:layout_weight="1"
                         android:text="@string/member_info_title"
                         android:textColor="@color/black"
-                        android:textSize="@dimen/normal_text_size_24" />
+                        android:textSize="@dimen/normal_text_size_18" />
 
                     <TextView
                         android:id="@+id/select_member_tv"
@@ -321,7 +388,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/locker"
                                 android:textColor="@color/black"
-                                android:textSize="@dimen/normal_text_size_24" />
+                                android:textSize="@dimen/normal_text_size_18" />
 
                             <View
                                 android:layout_width="match_parent"
@@ -368,7 +435,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/colocker"
                                 android:textColor="@color/black"
-                                android:textSize="@dimen/normal_text_size_24" />
+                                android:textSize="@dimen/normal_text_size_18" />
 
                             <View
                                 android:layout_width="match_parent"
@@ -404,7 +471,7 @@
                             android:paddingVertical="@dimen/common_spacing"
                             android:text="@string/please_select_member"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
                     </LinearLayout>
                 </FrameLayout>
             </LinearLayout>
@@ -414,7 +481,8 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:orientation="horizontal"
-            android:padding="@dimen/common_spacing">
+            android:paddingHorizontal="@dimen/common_spacing_2x"
+            android:paddingVertical="@dimen/common_spacing">
 
             <CheckBox
                 android:id="@+id/save_sop"

+ 88 - 17
app/src/main/res/layout/fragment_create_sop.xml

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/create_sop_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"
@@ -66,7 +66,7 @@
                 android:layout_weight="1"
                 android:text="@string/base_info_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <View
                 android:layout_width="match_parent"
@@ -116,7 +116,7 @@
                 <TextView
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:text="@string/flow_mode"
+                    android:text="@string/workflow_mode"
                     android:textColor="@color/black"
                     android:textSize="@dimen/common_text_size" />
 
@@ -167,18 +167,88 @@
                     android:textSize="@dimen/common_text_size" />
             </LinearLayout>
         </LinearLayout>
+
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="0dp"
             android:layout_weight="1"
             android:orientation="vertical">
+
             <LinearLayout
-                android:id="@+id/point_info_layout"
+                android:id="@+id/workflow_mode_layout"
                 android:layout_width="match_parent"
-                android:layout_height="wrap_content"
+                android:layout_height="0dp"
+                android:layout_marginHorizontal="@dimen/common_spacing_2x"
+                android:layout_marginVertical="@dimen/common_spacing"
                 android:layout_weight="1"
+                android:background="@drawable/home_card_bg"
+                android:gravity="center_vertical"
+                android:orientation="vertical">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:orientation="horizontal">
+
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="@dimen/common_spacing"
+                        android:layout_weight="1"
+                        android:text="@string/workflow_mode"
+                        android:textColor="@color/black"
+                        android:textSize="@dimen/normal_text_size_18" />
+
+                    <TextView
+                        android:id="@+id/workflow_mode_setting_tv"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="@dimen/common_spacing"
+                        android:layout_marginRight="@dimen/common_spacing"
+                        android:background="@drawable/common_btn"
+                        android:paddingHorizontal="@dimen/common_spacing_2x"
+                        android:text="@string/settings"
+                        android:textColor="@color/black"
+                        android:textSize="@dimen/common_btn_text_size" />
+                </LinearLayout>
+
+                <View
+                    android:layout_width="match_parent"
+                    android:layout_height="@dimen/divider_line_space"
+                    android:background="@color/black" />
+
+                <FrameLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:background="@drawable/card_white_bg">
+
+                    <androidx.recyclerview.widget.RecyclerView
+                        android:id="@+id/workflow_rv"
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:paddingBottom="@dimen/common_spacing" />
+
+                    <TextView
+                        android:id="@+id/select_workflow_tip"
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:background="@drawable/card_white_bg"
+                        android:gravity="center"
+                        android:paddingHorizontal="@dimen/common_spacing_2x"
+                        android:paddingVertical="@dimen/common_spacing"
+                        android:text="@string/please_select_workflow_mode"
+                        android:textColor="@color/black"
+                        android:textSize="@dimen/normal_text_size_18" />
+                </FrameLayout>
+            </LinearLayout>
+
+            <LinearLayout
+                android:id="@+id/point_info_layout"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
                 android:layout_marginHorizontal="@dimen/common_spacing_2x"
                 android:layout_marginVertical="@dimen/common_spacing"
+                android:layout_weight="1"
                 android:background="@drawable/home_card_bg"
                 android:gravity="center_vertical"
                 android:orientation="vertical">
@@ -195,7 +265,7 @@
                         android:layout_weight="1"
                         android:text="@string/point_info_title"
                         android:textColor="@color/black"
-                        android:textSize="@dimen/normal_text_size_24" />
+                        android:textSize="@dimen/normal_text_size_18" />
 
                     <TextView
                         android:id="@+id/select_point_tv"
@@ -222,7 +292,7 @@
                     <androidx.recyclerview.widget.RecyclerView
                         android:id="@+id/point_rv"
                         android:layout_width="match_parent"
-                        android:layout_height="240dp"
+                        android:layout_height="match_parent"
                         android:paddingBottom="@dimen/common_spacing" />
 
                     <LinearLayout
@@ -246,7 +316,7 @@
                             android:paddingVertical="@dimen/common_spacing"
                             android:text="@string/please_must_select_at_least_one_point"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
                     </LinearLayout>
                 </FrameLayout>
 
@@ -255,11 +325,11 @@
             <LinearLayout
                 android:id="@+id/member_info_layout"
                 android:layout_width="match_parent"
-                android:layout_height="wrap_content"
+                android:layout_height="0dp"
                 android:layout_marginHorizontal="@dimen/common_spacing_2x"
 
-                android:layout_weight="1"
                 android:layout_marginVertical="@dimen/common_spacing"
+                android:layout_weight="1"
                 android:background="@drawable/home_card_bg"
                 android:gravity="center_vertical"
                 android:orientation="vertical">
@@ -276,7 +346,7 @@
                         android:layout_weight="1"
                         android:text="@string/member_info_title"
                         android:textColor="@color/black"
-                        android:textSize="@dimen/normal_text_size_24" />
+                        android:textSize="@dimen/normal_text_size_18" />
 
                     <TextView
                         android:id="@+id/select_member_tv"
@@ -320,7 +390,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/locker"
                                 android:textColor="@color/black"
-                                android:textSize="@dimen/normal_text_size_24" />
+                                android:textSize="@dimen/normal_text_size_18" />
 
                             <View
                                 android:layout_width="match_parent"
@@ -331,8 +401,8 @@
                                 android:layout_width="match_parent"
                                 android:layout_height="match_parent"
                                 android:gravity="center"
-                                android:paddingBottom="@dimen/common_spacing"
-                                android:orientation="vertical">
+                                android:orientation="vertical"
+                                android:paddingBottom="@dimen/common_spacing">
 
                                 <ImageView
                                     android:layout_width="50dp"
@@ -367,7 +437,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/colocker"
                                 android:textColor="@color/black"
-                                android:textSize="@dimen/normal_text_size_24" />
+                                android:textSize="@dimen/normal_text_size_18" />
 
                             <View
                                 android:layout_width="match_parent"
@@ -403,7 +473,7 @@
                             android:paddingVertical="@dimen/common_spacing"
                             android:text="@string/please_select_member"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
                     </LinearLayout>
                 </FrameLayout>
             </LinearLayout>
@@ -415,7 +485,8 @@
             android:layout_height="wrap_content"
             android:gravity="right"
             android:orientation="horizontal"
-            android:padding="@dimen/common_spacing">
+            android:paddingHorizontal="@dimen/common_spacing_2x"
+            android:paddingVertical="@dimen/common_spacing">
 
             <TextView
                 android:id="@+id/confirm"

+ 77 - 10
app/src/main/res/layout/fragment_create_sop_job.xml

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/create_sop_job_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"
@@ -66,7 +66,7 @@
                 android:layout_weight="1"
                 android:text="@string/base_info_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <View
                 android:layout_width="match_parent"
@@ -174,11 +174,77 @@
             android:layout_height="0dp"
             android:layout_weight="1"
             android:orientation="vertical">
+            <LinearLayout
+                android:id="@+id/workflow_mode_layout"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_marginHorizontal="@dimen/common_spacing_2x"
+                android:layout_marginVertical="@dimen/common_spacing"
+                android:layout_weight="1"
+                android:background="@drawable/home_card_bg"
+                android:gravity="center_vertical"
+                android:orientation="vertical">
 
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:orientation="horizontal">
+
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="@dimen/common_spacing"
+                        android:layout_weight="1"
+                        android:text="@string/workflow_mode"
+                        android:textColor="@color/black"
+                        android:textSize="@dimen/normal_text_size_18" />
+
+                    <TextView
+                        android:id="@+id/workflow_mode_setting_tv"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="@dimen/common_spacing"
+                        android:layout_marginRight="@dimen/common_spacing"
+                        android:background="@drawable/common_btn"
+                        android:paddingHorizontal="@dimen/common_spacing_2x"
+                        android:text="@string/settings"
+                        android:textColor="@color/black"
+                        android:textSize="@dimen/common_btn_text_size" />
+                </LinearLayout>
+
+                <View
+                    android:layout_width="match_parent"
+                    android:layout_height="@dimen/divider_line_space"
+                    android:background="@color/black" />
+
+                <FrameLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:background="@drawable/card_white_bg">
+
+                    <androidx.recyclerview.widget.RecyclerView
+                        android:id="@+id/workflow_rv"
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:paddingBottom="@dimen/common_spacing" />
+
+                    <TextView
+                        android:id="@+id/select_workflow_tip"
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:background="@drawable/card_white_bg"
+                        android:gravity="center"
+                        android:paddingHorizontal="@dimen/common_spacing_2x"
+                        android:paddingVertical="@dimen/common_spacing"
+                        android:text="@string/please_select_workflow_mode"
+                        android:textColor="@color/black"
+                        android:textSize="@dimen/normal_text_size_18" />
+                </FrameLayout>
+            </LinearLayout>
             <LinearLayout
                 android:id="@+id/point_info_layout"
                 android:layout_width="match_parent"
-                android:layout_height="wrap_content"
+                android:layout_height="0dp"
                 android:layout_marginHorizontal="@dimen/common_spacing_2x"
                 android:layout_weight="1"
                 android:layout_marginVertical="@dimen/common_spacing"
@@ -198,7 +264,7 @@
                         android:layout_weight="1"
                         android:text="@string/point_info_title"
                         android:textColor="@color/black"
-                        android:textSize="@dimen/normal_text_size_24" />
+                        android:textSize="@dimen/normal_text_size_18" />
 
                 </LinearLayout>
 
@@ -214,7 +280,7 @@
                     <androidx.recyclerview.widget.RecyclerView
                         android:id="@+id/point_rv"
                         android:layout_width="match_parent"
-                        android:layout_height="240dp"
+                        android:layout_height="match_parent"
                         android:paddingBottom="@dimen/common_spacing" />
 
                     <LinearLayout
@@ -242,7 +308,7 @@
             <LinearLayout
                 android:id="@+id/member_info_layout"
                 android:layout_width="match_parent"
-                android:layout_height="wrap_content"
+                android:layout_height="0dp"
                 android:layout_marginHorizontal="@dimen/common_spacing_2x"
                 android:layout_weight="1"
                 android:layout_marginVertical="@dimen/common_spacing"
@@ -262,7 +328,7 @@
                         android:layout_weight="1"
                         android:text="@string/member_info_title"
                         android:textColor="@color/black"
-                        android:textSize="@dimen/normal_text_size_24" />
+                        android:textSize="@dimen/normal_text_size_18" />
 
                     <TextView
                         android:id="@+id/select_member_tv"
@@ -306,7 +372,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/locker"
                                 android:textColor="@color/black"
-                                android:textSize="@dimen/normal_text_size_24" />
+                                android:textSize="@dimen/normal_text_size_18" />
 
                             <View
                                 android:layout_width="match_parent"
@@ -353,7 +419,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/colocker"
                                 android:textColor="@color/black"
-                                android:textSize="@dimen/normal_text_size_24" />
+                                android:textSize="@dimen/normal_text_size_18" />
 
                             <View
                                 android:layout_width="match_parent"
@@ -395,7 +461,8 @@
             android:layout_height="wrap_content"
             android:gravity="right"
             android:orientation="horizontal"
-            android:padding="@dimen/common_spacing">
+            android:paddingHorizontal="@dimen/common_spacing"
+            android:paddingVertical="@dimen/common_spacing">
 
             <TextView
                 android:id="@+id/save_and_execute"

+ 69 - 10
app/src/main/res/layout/fragment_edit_job.xml

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/edit_job_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"
@@ -47,10 +47,13 @@
             android:layout_width="match_parent"
             android:layout_height="@dimen/divider_line_space"
             android:background="@color/black" />
+
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="match_parent"
+            android:layout_weight="1"
             android:orientation="vertical">
+
             <LinearLayout
                 android:id="@+id/base_info_layout"
                 android:layout_width="match_parent"
@@ -69,7 +72,7 @@
                     android:layout_weight="1"
                     android:text="@string/base_info_title"
                     android:textColor="@color/black"
-                    android:textSize="@dimen/normal_text_size_24" />
+                    android:textSize="@dimen/normal_text_size_18" />
 
                 <View
                     android:layout_width="match_parent"
@@ -119,7 +122,7 @@
                     <TextView
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
-                        android:text="@string/flow_mode"
+                        android:text="@string/workflow_mode"
                         android:textColor="@color/black"
                         android:textSize="@dimen/common_text_size" />
 
@@ -177,10 +180,66 @@
                 android:layout_weight="1"
                 android:orientation="vertical">
 
+                <LinearLayout
+                    android:id="@+id/workflow_mode_layout"
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    android:layout_marginHorizontal="@dimen/common_spacing_2x"
+                    android:layout_marginVertical="@dimen/common_spacing"
+                    android:layout_weight="1"
+                    android:background="@drawable/home_card_bg"
+                    android:gravity="center_vertical"
+                    android:orientation="vertical">
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginLeft="@dimen/common_spacing"
+                            android:layout_weight="1"
+                            android:text="@string/workflow_mode"
+                            android:textColor="@color/black"
+                            android:textSize="@dimen/normal_text_size_18" />
+
+                        <TextView
+                            android:id="@+id/workflow_mode_setting_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginLeft="@dimen/common_spacing"
+                            android:layout_marginRight="@dimen/common_spacing"
+                            android:background="@drawable/common_btn"
+                            android:paddingHorizontal="@dimen/common_spacing_2x"
+                            android:text="@string/settings"
+                            android:textColor="@color/black"
+                            android:textSize="@dimen/common_btn_text_size" />
+                    </LinearLayout>
+
+                    <View
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/divider_line_space"
+                        android:background="@color/black" />
+
+                    <FrameLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:background="@drawable/card_white_bg">
+
+                        <androidx.recyclerview.widget.RecyclerView
+                            android:id="@+id/workflow_rv"
+                            android:layout_width="match_parent"
+                            android:layout_height="match_parent"
+                            android:paddingBottom="@dimen/common_spacing" />
+                    </FrameLayout>
+                </LinearLayout>
+
                 <LinearLayout
                     android:id="@+id/point_info_layout"
                     android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
+                    android:layout_height="0dp"
                     android:layout_marginHorizontal="@dimen/common_spacing_2x"
                     android:layout_marginVertical="@dimen/common_spacing"
                     android:layout_weight="1"
@@ -200,7 +259,7 @@
                             android:layout_weight="1"
                             android:text="@string/point_info_title"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <TextView
                             android:id="@+id/select_point_tv"
@@ -223,7 +282,7 @@
                     <androidx.recyclerview.widget.RecyclerView
                         android:id="@+id/point_rv"
                         android:layout_width="match_parent"
-                        android:layout_height="240dp"
+                        android:layout_height="match_parent"
                         android:paddingBottom="@dimen/common_spacing" />
 
                 </LinearLayout>
@@ -231,7 +290,7 @@
                 <LinearLayout
                     android:id="@+id/member_info_layout"
                     android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
+                    android:layout_height="0dp"
                     android:layout_marginHorizontal="@dimen/common_spacing_2x"
                     android:layout_marginVertical="@dimen/common_spacing"
                     android:layout_weight="1"
@@ -251,7 +310,7 @@
                             android:layout_weight="1"
                             android:text="@string/member_info_title"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <TextView
                             android:id="@+id/select_member_tv"
@@ -292,7 +351,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/locker"
                                 android:textColor="@color/black"
-                                android:textSize="@dimen/normal_text_size_24" />
+                                android:textSize="@dimen/normal_text_size_18" />
 
                             <View
                                 android:layout_width="match_parent"
@@ -339,7 +398,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/colocker"
                                 android:textColor="@color/black"
-                                android:textSize="@dimen/normal_text_size_24" />
+                                android:textSize="@dimen/normal_text_size_18" />
 
                             <View
                                 android:layout_width="match_parent"

+ 68 - 11
app/src/main/res/layout/fragment_edit_sop.xml

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/edit_sop_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"
@@ -66,7 +66,7 @@
                 android:layout_weight="1"
                 android:text="@string/base_info_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <View
                 android:layout_width="match_parent"
@@ -116,7 +116,7 @@
                 <TextView
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:text="@string/flow_mode"
+                    android:text="@string/workflow_mode"
                     android:textColor="@color/black"
                     android:textSize="@dimen/common_text_size" />
 
@@ -174,10 +174,66 @@
             android:layout_weight="1"
             android:orientation="vertical">
 
+            <LinearLayout
+                android:id="@+id/workflow_mode_layout"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_marginHorizontal="@dimen/common_spacing_2x"
+                android:layout_marginVertical="@dimen/common_spacing"
+                android:layout_weight="1"
+                android:background="@drawable/home_card_bg"
+                android:gravity="center_vertical"
+                android:orientation="vertical">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:orientation="horizontal">
+
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="@dimen/common_spacing"
+                        android:layout_weight="1"
+                        android:text="@string/workflow_mode"
+                        android:textColor="@color/black"
+                        android:textSize="@dimen/normal_text_size_18" />
+
+                    <TextView
+                        android:id="@+id/workflow_mode_setting_tv"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="@dimen/common_spacing"
+                        android:layout_marginRight="@dimen/common_spacing"
+                        android:background="@drawable/common_btn"
+                        android:paddingHorizontal="@dimen/common_spacing_2x"
+                        android:text="@string/settings"
+                        android:textColor="@color/black"
+                        android:textSize="@dimen/common_btn_text_size" />
+                </LinearLayout>
+
+                <View
+                    android:layout_width="match_parent"
+                    android:layout_height="@dimen/divider_line_space"
+                    android:background="@color/black" />
+
+                <FrameLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:background="@drawable/card_white_bg">
+
+                    <androidx.recyclerview.widget.RecyclerView
+                        android:id="@+id/workflow_rv"
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:paddingBottom="@dimen/common_spacing" />
+                </FrameLayout>
+            </LinearLayout>
+
             <LinearLayout
                 android:id="@+id/point_info_layout"
                 android:layout_width="match_parent"
-                android:layout_height="wrap_content"
+                android:layout_height="0dp"
                 android:layout_marginHorizontal="@dimen/common_spacing_2x"
                 android:layout_marginVertical="@dimen/common_spacing"
                 android:layout_weight="1"
@@ -197,7 +253,7 @@
                         android:layout_weight="1"
                         android:text="@string/point_info_title"
                         android:textColor="@color/black"
-                        android:textSize="@dimen/normal_text_size_24" />
+                        android:textSize="@dimen/normal_text_size_18" />
 
                     <TextView
                         android:id="@+id/select_point_tv"
@@ -221,7 +277,7 @@
                 <androidx.recyclerview.widget.RecyclerView
                     android:id="@+id/point_rv"
                     android:layout_width="match_parent"
-                    android:layout_height="240dp"
+                    android:layout_height="match_parent"
                     android:paddingBottom="@dimen/common_spacing" />
 
             </LinearLayout>
@@ -229,7 +285,7 @@
             <LinearLayout
                 android:id="@+id/member_info_layout"
                 android:layout_width="match_parent"
-                android:layout_height="wrap_content"
+                android:layout_height="0dp"
                 android:layout_marginHorizontal="@dimen/common_spacing_2x"
                 android:layout_marginVertical="@dimen/common_spacing"
                 android:layout_weight="1"
@@ -249,7 +305,7 @@
                         android:layout_weight="1"
                         android:text="@string/member_info_title"
                         android:textColor="@color/black"
-                        android:textSize="@dimen/normal_text_size_24" />
+                        android:textSize="@dimen/normal_text_size_18" />
 
                     <TextView
                         android:id="@+id/select_member_tv"
@@ -289,7 +345,7 @@
                             android:paddingVertical="@dimen/common_spacing"
                             android:text="@string/locker"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <View
                             android:layout_width="match_parent"
@@ -336,7 +392,7 @@
                             android:paddingVertical="@dimen/common_spacing"
                             android:text="@string/colocker"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <View
                             android:layout_width="match_parent"
@@ -358,7 +414,8 @@
             android:layout_height="wrap_content"
             android:gravity="right"
             android:orientation="horizontal"
-            android:padding="@dimen/common_spacing">
+            android:paddingHorizontal="@dimen/common_spacing_2x"
+            android:paddingVertical="@dimen/common_spacing">
 
             <TextView
                 android:id="@+id/confirm"

+ 65 - 9
app/src/main/res/layout/fragment_edit_sop_job.xml

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/edit_sop_job_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"
@@ -66,7 +66,7 @@
                 android:layout_weight="1"
                 android:text="@string/base_info_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <View
                 android:layout_width="match_parent"
@@ -175,10 +175,66 @@
             android:layout_weight="1"
             android:orientation="vertical">
 
+            <LinearLayout
+                android:id="@+id/workflow_mode_layout"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_marginHorizontal="@dimen/common_spacing_2x"
+                android:layout_marginVertical="@dimen/common_spacing"
+                android:layout_weight="1"
+                android:background="@drawable/home_card_bg"
+                android:gravity="center_vertical"
+                android:orientation="vertical">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:orientation="horizontal">
+
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="@dimen/common_spacing"
+                        android:layout_weight="1"
+                        android:text="@string/workflow_mode"
+                        android:textColor="@color/black"
+                        android:textSize="@dimen/normal_text_size_18" />
+
+                    <TextView
+                        android:id="@+id/workflow_mode_setting_tv"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="@dimen/common_spacing"
+                        android:layout_marginRight="@dimen/common_spacing"
+                        android:background="@drawable/common_btn"
+                        android:paddingHorizontal="@dimen/common_spacing_2x"
+                        android:text="@string/settings"
+                        android:textColor="@color/black"
+                        android:textSize="@dimen/common_btn_text_size" />
+                </LinearLayout>
+
+                <View
+                    android:layout_width="match_parent"
+                    android:layout_height="@dimen/divider_line_space"
+                    android:background="@color/black" />
+
+                <FrameLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:background="@drawable/card_white_bg">
+
+                    <androidx.recyclerview.widget.RecyclerView
+                        android:id="@+id/workflow_rv"
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:paddingBottom="@dimen/common_spacing" />
+                </FrameLayout>
+            </LinearLayout>
+
             <LinearLayout
                 android:id="@+id/point_info_layout"
                 android:layout_width="match_parent"
-                android:layout_height="wrap_content"
+                android:layout_height="0dp"
                 android:layout_marginHorizontal="@dimen/common_spacing_2x"
                 android:layout_marginVertical="@dimen/common_spacing"
                 android:layout_weight="1"
@@ -198,7 +254,7 @@
                         android:layout_weight="1"
                         android:text="@string/point_info_title"
                         android:textColor="@color/black"
-                        android:textSize="@dimen/normal_text_size_24" />
+                        android:textSize="@dimen/normal_text_size_18" />
 
                 </LinearLayout>
 
@@ -210,7 +266,7 @@
                 <androidx.recyclerview.widget.RecyclerView
                     android:id="@+id/point_rv"
                     android:layout_width="match_parent"
-                    android:layout_height="240dp"
+                    android:layout_height="match_parent"
                     android:paddingBottom="@dimen/common_spacing" />
 
             </LinearLayout>
@@ -218,7 +274,7 @@
             <LinearLayout
                 android:id="@+id/member_info_layout"
                 android:layout_width="match_parent"
-                android:layout_height="wrap_content"
+                android:layout_height="0dp"
                 android:layout_marginHorizontal="@dimen/common_spacing_2x"
                 android:layout_marginVertical="@dimen/common_spacing"
                 android:layout_weight="1"
@@ -238,7 +294,7 @@
                         android:layout_weight="1"
                         android:text="@string/member_info_title"
                         android:textColor="@color/black"
-                        android:textSize="@dimen/normal_text_size_24" />
+                        android:textSize="@dimen/normal_text_size_18" />
 
                     <TextView
                         android:id="@+id/select_member_tv"
@@ -278,7 +334,7 @@
                             android:paddingVertical="@dimen/common_spacing"
                             android:text="@string/locker"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <View
                             android:layout_width="match_parent"
@@ -325,7 +381,7 @@
                             android:paddingVertical="@dimen/common_spacing"
                             android:text="@string/colocker"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <View
                             android:layout_width="match_parent"

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

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/exception_job_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"

+ 3 - 3
app/src/main/res/layout/fragment_home.xml

@@ -59,7 +59,7 @@
                     android:paddingLeft="@dimen/common_spacing"
                     android:text="@string/home_realtime_data_title"
                     android:textColor="@color/white"
-                    android:textSize="@dimen/normal_text_size_24" />
+                    android:textSize="@dimen/normal_text_size_18" />
 
                 <LinearLayout
                     android:id="@+id/realtime_data_filter_layout"
@@ -104,7 +104,7 @@
                         <TextView
                             android:layout_width="wrap_content"
                             android:layout_height="wrap_content"
-                            android:text="@string/flow_mode"
+                            android:text="@string/workflow_mode"
                             android:textColor="@color/black"
                             android:textSize="22sp" />
 
@@ -246,7 +246,7 @@
                     android:paddingLeft="@dimen/common_spacing"
                     android:text="@string/home_overview_data_title"
                     android:textColor="@color/white"
-                    android:textSize="@dimen/normal_text_size_24" />
+                    android:textSize="@dimen/normal_text_size_18" />
 
                 <LinearLayout
                     android:id="@+id/overview_data_filter_layout"

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

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/in_progress_job_manage_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"

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

@@ -31,7 +31,7 @@
                 android:layout_weight="1"
                 android:text="@string/job_manage_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"

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

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/job_manage_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"

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

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/key_manage_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"

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

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/key_manage_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"

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

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/locked_points_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"

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

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/point_manage_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"

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

@@ -31,7 +31,7 @@
                 android:layout_weight="1"
                 android:text="@string/reset_password_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"

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

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/key_manage_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"

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

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/role_manage_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"

+ 4 - 4
app/src/main/res/layout/fragment_select_memeber.xml

@@ -30,7 +30,7 @@
                 android:layout_marginLeft="@dimen/common_spacing"
                 android:text="@string/create_sop_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <ImageView
                 android:layout_width="wrap_content"
@@ -48,7 +48,7 @@
                 android:layout_marginLeft="@dimen/common_spacing"
                 android:text="@string/select_member_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <View
                 android:layout_width="0dp"
@@ -108,7 +108,7 @@
                             android:paddingVertical="@dimen/common_spacing"
                             android:text="@string/locker"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <TextView
                             android:id="@+id/select_locker_tv"
@@ -152,7 +152,7 @@
                             android:paddingVertical="@dimen/common_spacing"
                             android:text="@string/colocker"
                             android:textColor="@color/black"
-                            android:textSize="@dimen/normal_text_size_24" />
+                            android:textSize="@dimen/normal_text_size_18" />
 
                         <TextView
                             android:id="@+id/select_colocker_tv"

+ 4 - 4
app/src/main/res/layout/fragment_select_point.xml

@@ -30,7 +30,7 @@
                 android:layout_marginLeft="@dimen/common_spacing"
                 android:text="@string/create_sop_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <ImageView
                 android:layout_width="wrap_content"
@@ -48,7 +48,7 @@
                 android:layout_marginLeft="@dimen/common_spacing"
                 android:text="@string/select_point_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <View
                 android:layout_width="0dp"
@@ -94,7 +94,7 @@
                     android:layout_marginLeft="@dimen/common_spacing"
                     android:text="@string/selected_point_info_title"
                     android:textColor="@color/black"
-                    android:textSize="@dimen/normal_text_size_24" />
+                    android:textSize="@dimen/normal_text_size_18" />
 
                 <View
                     android:layout_width="match_parent"
@@ -126,7 +126,7 @@
                     android:layout_marginLeft="@dimen/common_spacing"
                     android:text="@string/unselected_point_info_title"
                     android:textColor="@color/black"
-                    android:textSize="@dimen/normal_text_size_24" />
+                    android:textSize="@dimen/normal_text_size_18" />
 
                 <View
                     android:layout_width="match_parent"

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

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/sop_manage_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"

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

@@ -31,7 +31,7 @@
                 android:layout_weight="1"
                 android:text="@string/user_info_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"

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

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/user_manage_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"

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

@@ -29,7 +29,7 @@
                 android:layout_weight="1"
                 android:text="@string/workstation_manage_title"
                 android:textColor="@color/black"
-                android:textSize="@dimen/normal_text_size_24" />
+                android:textSize="@dimen/normal_text_size_18" />
 
             <TextView
                 android:id="@+id/back"

+ 10 - 7
app/src/main/res/layout/item_home_menu.xml

@@ -2,21 +2,24 @@
 <layout xmlns:android="http://schemas.android.com/apk/res/android">
 
     <LinearLayout
-        android:layout_width="160dp"
-        android:layout_height="160dp"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/home_menu_item_layout_size"
+        android:padding="10dp"
         android:gravity="center_horizontal"
         android:orientation="vertical">
 
         <FrameLayout
             android:id="@+id/home_menu_layout"
-            android:layout_width="120dp"
-            android:layout_height="120dp"
+            android:layout_width="@dimen/home_menu_item_iv_layout_size"
+            android:layout_height="@dimen/home_menu_item_iv_layout_size"
+            android:clipChildren="false"
+            android:clipToPadding="false"
             android:background="@drawable/bg_home_menu_item">
 
             <ImageView
                 android:id="@+id/home_menu_iv"
-                android:layout_width="100dp"
-                android:layout_height="100dp"
+                android:layout_width="@dimen/home_menu_item_iv_size"
+                android:layout_height="@dimen/home_menu_item_iv_size"
                 android:layout_gravity="center" />
         </FrameLayout>
 
@@ -26,6 +29,6 @@
             android:layout_height="wrap_content"
             android:layout_marginTop="@dimen/common_spacing_small"
             android:textColor="@color/color_d7d2d2"
-            android:textSize="25sp" />
+            android:textSize="@dimen/home_menu_item_tv_text_size" />
     </LinearLayout>
 </layout>

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

@@ -15,7 +15,7 @@
             android:paddingHorizontal="8dp"
             android:paddingVertical="4dp"
             android:textColor="@color/black"
-            android:textSize="@dimen/normal_text_size_24" />
+            android:textSize="@dimen/normal_text_size_18" />
 
         <ImageView
             android:id="@+id/check_iv"

+ 51 - 0
app/src/main/res/layout/item_job_workflow_step.xml

@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:gravity="center"
+        android:orientation="horizontal">
+
+        <LinearLayout
+            android:id="@+id/step_layout"
+            android:layout_width="wrap_content"
+            android:layout_height="@dimen/workflow_step_item_height"
+            android:layout_marginLeft="@dimen/common_spacing"
+            android:background="@drawable/bg_job_execute_step"
+            android:gravity="center"
+            android:minWidth="@dimen/workflow_step_item_width"
+            android:orientation="vertical">
+
+            <TextView
+                android:id="@+id/step_name_tv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/common_spacing"
+                android:gravity="center"
+                android:text="@string/point_name_tv"
+                android:textSize="@dimen/common_text_size" />
+
+            <TextView
+                android:id="@+id/step_index_tv"
+                android:layout_width="@dimen/workflow_step_item_index_size"
+                android:layout_height="@dimen/workflow_step_item_index_size"
+                android:layout_marginTop="@dimen/common_spacing"
+                android:background="@drawable/bg_job_execute_step_index"
+                android:gravity="center"
+                android:includeFontPadding="false"
+                android:padding="@dimen/common_spacing_small"
+                android:textSize="@dimen/common_text_size"
+                tools:text="1" />
+        </LinearLayout>
+
+        <ImageView
+            android:id="@+id/divider_iv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/common_spacing"
+            android:src="@drawable/icon_job_execute_arrow_right" />
+    </LinearLayout>
+
+</layout>

BIN
app/src/main/res/mipmap-xhdpi/icon_job_manage_create_job.png


BIN
app/src/main/res/mipmap-xhdpi/icon_job_manage_create_sop.png


BIN
app/src/main/res/mipmap-xhdpi/icon_job_manage_in_progress_job.png


BIN
app/src/main/res/mipmap-xhdpi/icon_job_manage_sop_manage.png


+ 3 - 1
app/src/main/res/values-en/strings.xml

@@ -9,7 +9,7 @@
     <string name="home_realtime_data_title">Real-time data</string>
     <string name="home_overview_data_title">Overview data</string>
     <string name="zone">Zone</string>
-    <string name="flow_mode">Flow mode</string>
+    <string name="workflow_mode">Flow mode</string>
     <string name="login_failed">login failed</string>
     <string name="ongoing_job_tv">ongoing\njob</string>
     <string name="hardware_in_use_tv">Hardware \nin use</string>
@@ -335,5 +335,7 @@
     <string name="detect_port">Scanning Device......</string>
     <string name="card_already_registration">Card already registration</string>
     <string name="rfid_already_registration">RFID already registration</string>
+    <string name="please_input_username">Please input username</string>
+    <string name="please_select_workflow_mode">Please select workflow mode</string>
 
 </resources>

+ 6 - 2
app/src/main/res/values-land/dimens.xml

@@ -60,10 +60,10 @@
     <dimen name="home_item_quick_entrance_iv_layout">100dp</dimen>
     <dimen name="home_item_quick_entrance_iv">80dp</dimen>
     <dimen name="home_item_quick_entrace_text_size">24sp</dimen>
-    <dimen name="vector_icon_size">40.8dp</dimen>
+    <dimen name="vector_icon_size">24dp</dimen>
     <dimen name="item_login_tip_v_margin_top">32dp</dimen>
     <dimen name="item_login_tip_v_margin_right">23dp</dimen>
-    <dimen name="normal_text_size_24">24sp</dimen>
+    <dimen name="normal_text_size_18">18sp</dimen>
     <dimen name="login_dialog_width">844dp</dimen>
     <dimen name="login_dialog_height">744dp</dimen>
     <dimen name="login_dialog_text_size">42sp</dimen>
@@ -82,4 +82,8 @@
     <dimen name="home_bottom_nav_corner_radius">10dp</dimen>
     <dimen name="home_bottom_nav_notch_height">28dp</dimen>
     <dimen name="item_device_text_size">12sp</dimen>
+    <dimen name="home_menu_item_layout_size">180dp</dimen>
+    <dimen name="home_menu_item_iv_layout_size">120dp</dimen>
+    <dimen name="home_menu_item_iv_size">80dp</dimen>
+    <dimen name="home_menu_item_tv_text_size">25sp</dimen>
 </resources>

+ 3 - 1
app/src/main/res/values-zh/strings.xml

@@ -9,7 +9,7 @@
     <string name="home_realtime_data_title">实时数据</string>
     <string name="home_overview_data_title">总览数据</string>
     <string name="zone">区域范围</string>
-    <string name="flow_mode">流程模式</string>
+    <string name="workflow_mode">流程模式</string>
     <string name="login_failed">登录失败</string>
     <string name="ongoing_job_tv">进行中\n的作业</string>
     <string name="hardware_in_use_tv">使用中\n的硬件</string>
@@ -335,5 +335,7 @@
     <string name="detect_port">正在扫描设备......</string>
     <string name="card_already_registration">卡片已录入</string>
     <string name="rfid_already_registration">RFID标签已录入</string>
+    <string name="please_input_username">请输入登录名</string>
+    <string name="please_select_workflow_mode">请选择流程模式</string>
 
 </resources>

+ 8 - 1
app/src/main/res/values/dimens.xml

@@ -63,7 +63,7 @@
     <dimen name="vector_icon_size">24dp</dimen>
     <dimen name="item_login_tip_v_margin_top">19dp</dimen>
     <dimen name="item_login_tip_v_margin_right">14dp</dimen>
-    <dimen name="normal_text_size_24">24sp</dimen>
+    <dimen name="normal_text_size_18">18sp</dimen>
     <dimen name="login_dialog_width">497dp</dimen>
     <dimen name="login_dialog_height">438dp</dimen>
     <dimen name="login_dialog_text_size">25sp</dimen>
@@ -74,6 +74,9 @@
     <dimen name="point_rv_height">240dp</dimen>
     <dimen name="colocker_layout_height">50dp</dimen>
     <dimen name="btn_layout_min_height">60dp</dimen>
+    <dimen name="workflow_step_item_width">120dp</dimen>
+    <dimen name="workflow_step_item_height">100dp</dimen>
+    <dimen name="workflow_step_item_index_size">30dp</dimen>
     <dimen name="step_item_width">120dp</dimen>
     <dimen name="step_item_height">180dp</dimen>
     <dimen name="step_item_icon_size">70dp</dimen>
@@ -82,4 +85,8 @@
     <dimen name="home_bottom_nav_corner_radius">30dp</dimen>
     <dimen name="home_bottom_nav_notch_height">28dp</dimen>
     <dimen name="item_device_text_size">12sp</dimen>
+    <dimen name="home_menu_item_layout_size">180dp</dimen>
+    <dimen name="home_menu_item_iv_layout_size">120dp</dimen>
+    <dimen name="home_menu_item_iv_size">80dp</dimen>
+    <dimen name="home_menu_item_tv_text_size">25sp</dimen>
 </resources>

+ 3 - 1
app/src/main/res/values/strings.xml

@@ -8,7 +8,7 @@
     <string name="home_realtime_data_title">实时数据</string>
     <string name="home_overview_data_title">总览数据</string>
     <string name="zone">区域范围</string>
-    <string name="flow_mode">流程模式</string>
+    <string name="workflow_mode">流程模式</string>
     <string name="login_failed">登录失败</string>
     <string name="ongoing_job_tv">进行中\n的作业</string>
     <string name="hardware_in_use_tv">使用中\n的硬件</string>
@@ -338,5 +338,7 @@
     <string name="detect_port">正在扫描设备......</string>
     <string name="card_already_registration">卡片已录入</string>
     <string name="rfid_already_registration">RFID标签已录入</string>
+    <string name="please_input_username">请输入登录名</string>
+    <string name="please_select_workflow_mode">请选择流程模式</string>
 
 </resources>

+ 3 - 3
data/src/main/java/com/grkj/data/dao/IsSopDao.kt

@@ -45,7 +45,7 @@ interface IsSopDao {
         select sop_id as sopId,
             `is`.sop_name as sopName,
             `is`.sop_type as sopType,
-            `is`.lock_mode as lockMode,
+            `is`.mode_id as modeId,
             `is`.workstation_id as workstationId,
             iw.workstation_name as workstationName,
             `is`.del_flag as delFlag 
@@ -122,7 +122,7 @@ interface IsSopDao {
         select sop_id as sopId,
             `is`.sop_name as sopName,
             `is`.sop_type as sopType,
-            `is`.lock_mode as lockMode,
+            `is`.mode_id as modeId,
             `is`.workstation_id as workstationId,
             iw.workstation_name as workstationName,
             `is`.del_flag as delFlag 
@@ -159,7 +159,7 @@ interface IsSopDao {
         select sop_id as sopId,
             `is`.sop_name as sopName,
             `is`.sop_type as sopType,
-            `is`.lock_mode as lockMode,
+            `is`.mode_id as modeId,
             `is`.workstation_id as workstationId,
             iw.workstation_name as workstationName,
             `is`.del_flag as delFlag 

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

@@ -112,8 +112,8 @@ interface JobTicketDao {
         ticket_name as ticketName,
         ticket_status as ticketStatus,
         workstation_id as workstationId,
-        lock_mode as lockMode,
-        sop_id as sopId
+        sop_id as sopId,
+        mode_id as modeId
         from is_job_ticket
         order by update_time desc 
         limit :size offset :offset
@@ -176,8 +176,8 @@ interface JobTicketDao {
         ticket_name as ticketName,
         ticket_status as ticketStatus,
         workstation_id as workstationId,
-        lock_mode as lockMode,
-        sop_id as sopId
+        sop_id as sopId,
+        mode_id as modeId
         from is_job_ticket
         where ticket_id = :ticketId
     """
@@ -298,9 +298,22 @@ interface JobTicketDao {
     @Query(
         "select count(1) from is_job_ticket where ticket_status in ('1','2','3','4') " +
                 "AND (:workstationId IS NULL OR trim(:workstationId) = '' OR workstation_id = :workstationId) " +
-                "AND (trim(:lockMode) = '' OR lock_mode like '%'|| :lockMode ||'%')"
+                "AND (:modeId IS NULL OR trim(:modeId) = '' OR mode_id = :modeId) "
     )
-    fun getInProgressJobSize(workstationId: Long?, lockMode: String): Int
+    fun getInProgressJobSize(workstationId: Long?, modeId: Long?): Int
+
+    /**
+     * 获取工作中的作业数量
+     */
+    @Query(
+        "select count(1) from is_job_ticket ijt where EXISTS ( " +
+                "  SELECT 1 " +
+                "  FROM is_job_ticket_step ijts" +
+                "  WHERE ijts.ticket_id   = ijt.ticket_id" +
+                "    AND ijts.step_status = 0" +
+                ")"
+    )
+    fun getInProgressJobSize(): Int
 
     /**
      * 获取所有作业数量

+ 60 - 0
data/src/main/java/com/grkj/data/dao/WorkflowStepDao.kt

@@ -0,0 +1,60 @@
+package com.grkj.data.dao
+
+import androidx.room.Dao
+import androidx.room.Delete
+import androidx.room.Insert
+import androidx.room.Query
+import androidx.room.Update
+import com.grkj.data.model.dos.WorkflowMode
+import com.grkj.data.model.dos.WorkflowStep
+
+/**
+ * 工作流步骤表 DAO
+ */
+@Dao
+interface WorkflowStepDao {
+    @Insert
+    fun insertStep(step: WorkflowStep): Long
+
+    @Update
+    fun updateStep(step: WorkflowStep)
+
+    @Delete
+    fun deleteStep(step: WorkflowStep)
+
+    /**
+     * 获取指定模式下的所有步骤,按序号升序
+     */
+    @Query("SELECT * FROM is_workflow_step WHERE mode_id = :modeId ORDER BY step_index ASC")
+    fun getStepsByMode(modeId: Long): List<WorkflowStep>
+
+    /**
+     * 获取下一个可用步骤序号
+     */
+    @Query("SELECT COALESCE(MAX(step_index), 0) + 1 FROM is_workflow_step WHERE mode_id = :modeId")
+    fun getNextStepIndex(modeId: Long): Int
+
+    /**
+     * 根据步骤id获取步骤信息
+     */
+    @Query("SELECT * FROM is_workflow_step WHERE step_id = :id LIMIT 1")
+    fun getStepById(id: Long): WorkflowStep?
+
+    /**
+     * 判定在同一模式下 "解锁" 步骤是否排在 "上锁" 步骤之前
+     * 通过比较两者的最小 step_index
+     */
+    @Query(
+        "SELECT CASE WHEN " +
+                "(SELECT MIN(step_index) FROM is_workflow_step WHERE mode_id = :modeId AND enable_unlock = 1) < " +
+                "(SELECT MIN(step_index) FROM is_workflow_step WHERE mode_id = :modeId AND enable_lock = 1) " +
+                "THEN 1 ELSE 0 END"
+    )
+    fun isUnlockBeforeLock(modeId: Long): Boolean
+
+    @Query("select * from is_workflow_mode")
+    fun getWorkflowModes(): List<WorkflowMode>
+
+    @Query("select * from is_workflow_mode where mode_id = :modeId")
+    fun getWorkflowModeByModeId(modeId: Long): WorkflowMode?
+}

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

@@ -12,6 +12,7 @@ import com.grkj.data.dao.RfidTokenDao
 import com.grkj.data.dao.RoleDao
 import com.grkj.data.dao.SysMenuDao
 import com.grkj.data.dao.UserDao
+import com.grkj.data.dao.WorkflowStepDao
 import com.grkj.data.dao.WorkstationDao
 import com.grkj.data.model.dos.IsIsolationPoint
 import com.grkj.data.model.dos.IsJobCard
@@ -39,6 +40,9 @@ import com.grkj.data.model.dos.SysRoleMenu
 import com.grkj.data.model.dos.SysUserCharacteristicDo
 import com.grkj.data.model.dos.SysUserDo
 import com.grkj.data.model.dos.SysUserRole
+import com.grkj.data.model.dos.WorkflowMode
+import com.grkj.data.model.dos.WorkflowStep
+import com.grkj.data.model.dos.WorkflowStepTemplate
 import com.grkj.shared.config.Constants
 import com.sik.sikcore.SIKCore
 
@@ -51,7 +55,8 @@ import com.sik.sikcore.SIKCore
         SysRole::class, SysUserRole::class, IsUserWorkstation::class, IsWorkstation::class, IsIsolationPoint::class, IsRfidToken::class,
         IsSop::class, IsSopUser::class, IsSopPoints::class, IsJobTicket::class, IsJobTicketKey::class, IsJobTicketLock::class,
         IsJobTicketPoints::class, IsJobTicketStep::class, IsJobTicketUser::class,
-        IsKey::class, IsLock::class, IsLockCabinet::class, IsLockCabinetSlots::class, IsLocksetType::class, IsLockset::class, SysMenu::class, SysRoleMenu::class
+        IsKey::class, IsLock::class, IsLockCabinet::class, IsLockCabinetSlots::class, IsLocksetType::class, IsLockset::class, SysMenu::class, SysRoleMenu::class,
+        WorkflowStep::class, WorkflowMode::class, WorkflowStepTemplate::class
     ],
     version = ISCSMigrations.VERSION,
     exportSchema = true
@@ -91,4 +96,6 @@ abstract class ISCSDatabase : RoomDatabase() {
     abstract fun jobTicketDao(): JobTicketDao
 
     abstract fun sysMenuDao(): SysMenuDao
+
+    abstract fun workflowStepDao(): WorkflowStepDao
 }

+ 2 - 0
data/src/main/java/com/grkj/data/di/AppEntryPoint.kt

@@ -9,6 +9,7 @@ import com.grkj.data.repository.IRoleRepository
 import com.grkj.data.repository.ISopRepository
 import com.grkj.data.repository.ISysMenuRepository
 import com.grkj.data.repository.IUserRepository
+import com.grkj.data.repository.IWorkflowRepository
 import com.grkj.data.repository.IWorkstationRepository
 import dagger.hilt.EntryPoint
 import dagger.hilt.InstallIn
@@ -26,4 +27,5 @@ interface AppEntryPoint {
     fun userRepo(): IUserRepository
     fun workstationRepo(): IWorkstationRepository
     fun sysMenuRepo(): ISysMenuRepository
+    fun workflowRepo(): IWorkflowRepository
 }

+ 4 - 0
data/src/main/java/com/grkj/data/di/DatabaseModule.kt

@@ -10,6 +10,7 @@ import com.grkj.data.dao.RfidTokenDao
 import com.grkj.data.dao.RoleDao
 import com.grkj.data.dao.SysMenuDao
 import com.grkj.data.dao.UserDao
+import com.grkj.data.dao.WorkflowStepDao
 import com.grkj.data.dao.WorkstationDao
 import com.grkj.data.database.ISCSDatabase
 import dagger.Module
@@ -64,4 +65,7 @@ object DatabaseModule {
     @Provides
     fun provideSysMenuDao(db: ISCSDatabase): SysMenuDao =
         db.sysMenuDao()
+
+    @Provides
+    fun provideWorkflowStepDao(db: ISCSDatabase): WorkflowStepDao = db.workflowStepDao()
 }

+ 3 - 2
data/src/main/java/com/grkj/data/di/RepositoryManager.kt

@@ -1,7 +1,6 @@
 package com.grkj.data.di
 
 import android.app.Application
-import com.grkj.data.database.ISCSDatabase
 import com.grkj.data.repository.IHardwareRepository
 import com.grkj.data.repository.IIsolationPointRepository
 import com.grkj.data.repository.IJobTicketRepository
@@ -10,8 +9,8 @@ import com.grkj.data.repository.IRoleRepository
 import com.grkj.data.repository.ISopRepository
 import com.grkj.data.repository.ISysMenuRepository
 import com.grkj.data.repository.IUserRepository
+import com.grkj.data.repository.IWorkflowRepository
 import com.grkj.data.repository.IWorkstationRepository
-import com.grkj.data.repository.impl.SysMenuRepository
 import dagger.hilt.android.EntryPointAccessors
 
 /**
@@ -27,6 +26,7 @@ object RepositoryManager {
     lateinit var userRepo: IUserRepository
     lateinit var workstationRepo: IWorkstationRepository
     lateinit var sysMenuRepository: ISysMenuRepository
+    lateinit var workflowRepository: IWorkflowRepository
 
     fun init(app: Application) {
         val ep = EntryPointAccessors.fromApplication(app, AppEntryPoint::class.java)
@@ -39,5 +39,6 @@ object RepositoryManager {
         userRepo = ep.userRepo()
         workstationRepo = ep.workstationRepo()
         sysMenuRepository = ep.sysMenuRepo()
+        workflowRepository = ep.workflowRepo()
     }
 }

+ 8 - 0
data/src/main/java/com/grkj/data/di/RepositoryModule.kt

@@ -8,6 +8,7 @@ import com.grkj.data.repository.IRoleRepository
 import com.grkj.data.repository.ISopRepository
 import com.grkj.data.repository.ISysMenuRepository
 import com.grkj.data.repository.IUserRepository
+import com.grkj.data.repository.IWorkflowRepository
 import com.grkj.data.repository.IWorkstationRepository
 import com.grkj.data.repository.impl.HardwareRepository
 import com.grkj.data.repository.impl.IsolationPointRepository
@@ -17,6 +18,7 @@ import com.grkj.data.repository.impl.RoleRepository
 import com.grkj.data.repository.impl.SopRepository
 import com.grkj.data.repository.impl.SysMenuRepository
 import com.grkj.data.repository.impl.UserRepository
+import com.grkj.data.repository.impl.WorkflowRepository
 import com.grkj.data.repository.impl.WorkstationRepository
 import dagger.Binds
 import dagger.Module
@@ -80,4 +82,10 @@ abstract class RepositoryModule {
     abstract fun bindSysMenuRepository(
         impl: SysMenuRepository
     ): ISysMenuRepository
+
+    @Binds
+    @Singleton
+    abstract fun bindWorkflowRepository(
+        impl: WorkflowRepository
+    ): IWorkflowRepository
 }

+ 0 - 40
data/src/main/java/com/grkj/data/enums/LockModeEnum.kt

@@ -1,40 +0,0 @@
-package com.grkj.data.enums
-
-import com.grkj.data.model.res.LockInfoRes
-
-/**
- * 锁定模式
- */
-enum class LockModeEnum(val lockMode: List<LockStepEnum>, val description: String) {
-    LOCK_MODE_1(
-        listOf(
-            LockStepEnum.SELECT_MEMBER,
-            LockStepEnum.LOCK,
-            LockStepEnum.COLOCK,
-            LockStepEnum.UNLOCK
-        ), "上锁->共锁->解锁"
-    ),
-    LOCK_MODE_2(
-        listOf(LockStepEnum.SELECT_MEMBER, LockStepEnum.LOCK, LockStepEnum.UNLOCK),
-        "上锁->解锁"
-    ),
-    LOCK_MODE_3(
-        listOf(LockStepEnum.SELECT_MEMBER, LockStepEnum.UNLOCK, LockStepEnum.LOCK),
-        "解锁->上锁"
-    ),
-    LOCK_MODE_4(listOf(LockStepEnum.SELECT_MEMBER, LockStepEnum.LOCK), "上锁"),
-    LOCK_MODE_5(listOf(LockStepEnum.SELECT_MEMBER, LockStepEnum.UNLOCK), "解锁");
-
-    companion object {
-        /**
-         * 是否解锁优先
-         */
-        @JvmStatic
-        fun isUnLockFirst(lockMode: String): Boolean {
-            val lockStep = lockMode.split(",")
-            val lockIndex = lockStep.indexOfFirst { it == LockStepEnum.LOCK.type.toString() }
-            val unLockIndex = lockStep.indexOfFirst { it == LockStepEnum.UNLOCK.type.toString() }
-            return unLockIndex < lockIndex
-        }
-    }
-}

+ 0 - 14
data/src/main/java/com/grkj/data/enums/LockStepEnum.kt

@@ -1,14 +0,0 @@
-package com.grkj.data.enums
-
-/**
- * 锁定步骤枚举
- */
-enum class LockStepEnum(val type: Int, val description: String) {
-    SELECT_MEMBER(0, "选择人员"),
-    LOCK(1, "上锁"),
-    COLOCK(2, "共锁"),
-    UNLOCK(3, "解锁"),
-    UNLOCKED(4, "已解锁"),
-    LOCKED(5, "已上锁")
-    ;
-}

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

@@ -20,9 +20,6 @@ open class IsJobTicket : BaseBean() {
     @ColumnInfo("ticket_name")
     var ticketName: String = ""
 
-    @ColumnInfo("lock_mode")
-    var lockMode: String? = null
-
     @ColumnInfo("workshop_id")
     var workshopId: Long? = null
 
@@ -35,6 +32,9 @@ open class IsJobTicket : BaseBean() {
     @ColumnInfo("machinery_id")
     var machineryId: Long? = null
 
+    @ColumnInfo("mode_id")
+    var modeId: Long = 0
+
     @ColumnInfo("sop_id")
     var sopId: Long? = null
 
@@ -56,6 +56,4 @@ open class IsJobTicket : BaseBean() {
 
     @ColumnInfo("del_flag")
     var delFlag: String? = "0"
-
-
 }

+ 2 - 0
data/src/main/java/com/grkj/data/model/dos/IsJobTicketStep.kt

@@ -31,5 +31,7 @@ open class IsJobTicketStep : BaseBean() {
     @ColumnInfo("del_flag")
     var delFlag: String? = "0"
 
+    @ColumnInfo("workflow_step_id")
+    var workflowStepId: Long = 0
 
 }

+ 2 - 2
data/src/main/java/com/grkj/data/model/dos/IsSop.kt

@@ -22,8 +22,8 @@ class IsSop : BaseBean() {
     @ColumnInfo("sop_type")
     var sopType: String? = null
 
-    @ColumnInfo("lock_mode")
-    var lockMode: String? = null
+    @ColumnInfo("mode_id")
+    var modeId: Long = 0
 
     @ColumnInfo("workshop_id")
     var workshopId: Long? = null

+ 66 - 0
data/src/main/java/com/grkj/data/model/dos/WorkflowMode.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_workflow_mode")
+data class WorkflowMode(
+    /** 自增主键,模式 ID */
+    @PrimaryKey(autoGenerate = true)
+    @ColumnInfo(name = "mode_id")
+    var modeId: Long = 0L,
+
+    /** 模式编码 */
+    @ColumnInfo(name = "mode_code")
+    var modeCode: String? = null,
+
+    /** 是否预置 */
+    @ColumnInfo(name = "is_preset")
+    var isPreset: Boolean = false,
+
+    /** 模式名称 */
+    @ColumnInfo(name = "mode_name")
+    var modeName: String? = null,
+
+    /** 模式标题 */
+    @ColumnInfo(name = "mode_title")
+    var modeTitle: String? = null,
+
+    /** 模式描述信息 */
+    @ColumnInfo(name = "mode_description")
+    var modeDescription: String? = null,
+
+    /** 是否支持共锁 */
+    @ColumnInfo(name = "is_colock_support")
+    var isColockSupport: Boolean = false,
+
+    /** 创建者 */
+    @ColumnInfo(name = "creator")
+    var creator: String? = null,
+
+    /** 创建时间,格式 yyyy-MM-dd HH:mm:ss */
+    @ColumnInfo(name = "create_time")
+    var createTime: String,
+
+    /** 更新者 */
+    @ColumnInfo(name = "updater")
+    var updater: String,
+
+    /** 更新时间,格式 yyyy-MM-dd HH:mm:ss */
+    @ColumnInfo(name = "update_time")
+    var updateTime: String,
+
+    /** 是否删除 */
+    @ColumnInfo(name = "deleted")
+    var deleted: Boolean = false,
+
+    /** 租户编号 */
+    @ColumnInfo(name = "tenant_id")
+    var tenantId: Long
+)

+ 124 - 0
data/src/main/java/com/grkj/data/model/dos/WorkflowStep.kt

@@ -0,0 +1,124 @@
+package com.grkj.data.model.dos
+
+import androidx.room.ColumnInfo
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+
+/**
+ * 工作流步骤表实体
+ */
+@Entity(tableName = "is_workflow_step")
+data class WorkflowStep(
+    /** 自增主键,步骤 ID */
+    @PrimaryKey(autoGenerate = true)
+    @ColumnInfo(name = "step_id")
+    var stepId: Long = 0L,
+
+    /** 所属模式 ID */
+    @ColumnInfo(name = "mode_id")
+    var modeId: Long,
+
+    /** 步骤模板 ID */
+    @ColumnInfo(name = "step_template_id")
+    var stepTemplateId: Long? = null,
+
+    /** 步骤序号 */
+    @ColumnInfo(name = "step_index")
+    var stepIndex: Int = 0,
+
+    /** 步骤名称 */
+    @ColumnInfo(name = "step_name")
+    var stepName: String? = null,
+
+    /** 步骤标题 */
+    @ColumnInfo(name = "step_title")
+    var stepTitle: String? = null,
+
+    /** 步骤短标题 */
+    @ColumnInfo(name = "step_title_short")
+    var stepTitleShort: String? = null,
+
+    /** 步骤描述信息 */
+    @ColumnInfo(name = "step_description")
+    var stepDescription: String? = null,
+
+    /** 确认类型,0=手动 */
+    @ColumnInfo(name = "confirm_type")
+    var confirmType: Int = 0,
+
+    /** 确认角色编码 */
+    @ColumnInfo(name = "confirm_role_code")
+    var confirmRoleCode: String? = null,
+
+    /** 确认人员 ID */
+    @ColumnInfo(name = "confirm_user")
+    var confirmUser: Long? = null,
+
+    /** 是否可取消作业 */
+    @ColumnInfo(name = "enable_cancel_job")
+    var enableCancelJob: Boolean = false,
+
+    /** 是否可设置锁定人 */
+    @ColumnInfo(name = "enable_set_locker")
+    var enableSetLocker: Boolean = false,
+
+    /** 是否可设置共锁人 */
+    @ColumnInfo(name = "enable_set_colocker")
+    var enableSetColocker: Boolean = false,
+
+    /** 是否可添加共锁人 */
+    @ColumnInfo(name = "enable_add_colocker")
+    var enableAddColocker: Boolean = false,
+
+    /** 添加共锁人后跳转步骤序号 */
+    @ColumnInfo(name = "goto_step_after_adding_colocker")
+    var gotoStepAfterAddingColocker: Int? = null,
+
+    /** 是否可减少共锁人 */
+    @ColumnInfo(name = "enable_reduce_colocker")
+    var enableReduceColocker: Boolean = false,
+
+    /** 是否可上锁 */
+    @ColumnInfo(name = "enable_lock")
+    var enableLock: Boolean = false,
+
+    /** 是否可共锁 */
+    @ColumnInfo(name = "enable_colock")
+    var enableColock: Boolean = false,
+
+    /** 是否可解除共锁 */
+    @ColumnInfo(name = "enable_release_colock")
+    var enableReleaseColock: Boolean = false,
+
+    /** 是否可解锁 */
+    @ColumnInfo(name = "enable_unlock")
+    var enableUnlock: Boolean = false,
+
+    /** 是否可结束作业 */
+    @ColumnInfo(name = "enable_end_job")
+    var enableEndJob: Boolean = false,
+
+    /** 创建者 */
+    @ColumnInfo(name = "creator")
+    var creator: String? = null,
+
+    /** 创建时间,格式 yyyy-MM-dd HH:mm:ss */
+    @ColumnInfo(name = "create_time")
+    var createTime: String,
+
+    /** 更新者 */
+    @ColumnInfo(name = "updater")
+    var updater: String,
+
+    /** 更新时间,格式 yyyy-MM-dd HH:mm:ss */
+    @ColumnInfo(name = "update_time")
+    var updateTime: String,
+
+    /** 是否删除 */
+    @ColumnInfo(name = "deleted")
+    var deleted: Boolean = false,
+
+    /** 租户编号 */
+    @ColumnInfo(name = "tenant_id")
+    var tenantId: Long = 0
+)

+ 120 - 0
data/src/main/java/com/grkj/data/model/dos/WorkflowStepTemplate.kt

@@ -0,0 +1,120 @@
+package com.grkj.data.model.dos
+
+import androidx.room.ColumnInfo
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+
+/**
+ * 工作流步骤模板表实体
+ */
+@Entity(tableName = "is_workflow_step_template")
+data class WorkflowStepTemplate(
+    /** 自增主键,模板 ID */
+    @PrimaryKey(autoGenerate = true)
+    @ColumnInfo(name = "template_id")
+    var templateId: Long = 0L,
+
+    /** 步骤编码 */
+    @ColumnInfo(name = "step_code")
+    var stepCode: String,
+
+    /** 是否预置 */
+    @ColumnInfo(name = "is_preset")
+    var isPreset: Boolean = false,
+
+    /** 步骤名称 */
+    @ColumnInfo(name = "step_name")
+    var stepName: String? = null,
+
+    /** 步骤标题 */
+    @ColumnInfo(name = "step_title")
+    var stepTitle: String? = null,
+
+    /** 步骤短标题 */
+    @ColumnInfo(name = "step_title_short")
+    var stepTitleShort: String? = null,
+
+    /** 步骤描述信息 */
+    @ColumnInfo(name = "step_description")
+    var stepDescription: String? = null,
+
+    /** 确认类型,0=手动 */
+    @ColumnInfo(name = "confirm_type")
+    var confirmType: Int = 0,
+
+    /** 确认角色编码 */
+    @ColumnInfo(name = "confirm_role_code")
+    var confirmRoleCode: String? = null,
+
+    /** 确认人员 ID */
+    @ColumnInfo(name = "confirm_user")
+    var confirmUser: Long? = null,
+
+    /** 是否可取消作业 */
+    @ColumnInfo(name = "enable_cancel_job")
+    var enableCancelJob: Boolean = false,
+
+    /** 是否可设置锁定人 */
+    @ColumnInfo(name = "enable_set_locker")
+    var enableSetLocker: Boolean = false,
+
+    /** 是否可设置共锁人 */
+    @ColumnInfo(name = "enable_set_colocker")
+    var enableSetColocker: Boolean = false,
+
+    /** 是否可添加共锁人 */
+    @ColumnInfo(name = "enable_add_colocker")
+    var enableAddColocker: Boolean = false,
+
+    /** 添加共锁人后跳转步骤序号 */
+    @ColumnInfo(name = "goto_step_after_adding_colocker")
+    var gotoStepAfterAddingColocker: Int? = null,
+
+    /** 是否可减少共锁人 */
+    @ColumnInfo(name = "enable_reduce_colocker")
+    var enableReduceColocker: Boolean = false,
+
+    /** 是否可上锁 */
+    @ColumnInfo(name = "enable_lock")
+    var enableLock: Boolean = false,
+
+    /** 是否可共锁 */
+    @ColumnInfo(name = "enable_colock")
+    var enableColock: Boolean = false,
+
+    /** 是否可解除共锁 */
+    @ColumnInfo(name = "enable_release_colock")
+    var enableReleaseColock: Boolean = false,
+
+    /** 是否可解锁 */
+    @ColumnInfo(name = "enable_unlock")
+    var enableUnlock: Boolean = false,
+
+    /** 是否可结束作业 */
+    @ColumnInfo(name = "enable_end_job")
+    var enableEndJob: Boolean = false,
+
+    /** 创建者 */
+    @ColumnInfo(name = "creator")
+    var creator: String? = null,
+
+    /** 创建时间,格式 yyyy-MM-dd HH:mm:ss */
+    @ColumnInfo(name = "create_time")
+    var createTime: String,
+
+    /** 更新者 */
+    @ColumnInfo(name = "updater")
+    var updater: String,
+
+    /** 更新时间,格式 yyyy-MM-dd HH:mm:ss */
+    @ColumnInfo(name = "update_time")
+    var updateTime: String,
+
+    /** 是否删除 */
+    @ColumnInfo(name = "deleted")
+    var deleted: Boolean = false,
+
+    /** 租户编号 */
+    @ColumnInfo(name = "tenant_id")
+    var tenantId: Long
+)

+ 1 - 0
data/src/main/java/com/grkj/data/model/vo/AddUserDataVo.kt

@@ -4,6 +4,7 @@ package com.grkj.data.model.vo
  * 添加用户
  */
 data class AddUserDataVo(
+    val username: String,
     val nickname: String,
     val cardCode: String?,
     val roleId: List<Long>,

+ 1 - 1
data/src/main/java/com/grkj/data/model/vo/JobTicketManageVo.kt

@@ -12,7 +12,7 @@ class JobTicketManageVo {
 
     var ticketStatus: String = "0"
 
-    var lockMode: String? = null
+    var modeId: Long? = null
 
     var workstationId: Long = 0
 

+ 1 - 1
data/src/main/java/com/grkj/data/model/vo/SopManageVo.kt

@@ -12,7 +12,7 @@ class SopManageVo {
 
     var sopType: String? = null
 
-    var lockMode: String? = null
+    var modeId: Long = 0
 
     var workstationId: Long = 0
 

+ 1 - 0
data/src/main/java/com/grkj/data/model/vo/UpdateUserDataVo.kt

@@ -5,6 +5,7 @@ package com.grkj.data.model.vo
  */
 data class UpdateUserDataVo(
     val userId: Long,
+    val username: String,
     val nickname: String,
     val cardCode: String,
     val roleId: List<Long>,

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

@@ -72,11 +72,6 @@ interface IHardwareRepository {
      */
     fun getDictData(dictKey: String, callback: (List<CommonDictRes>) -> Unit)
 
-    /**
-     * 创建卡片
-     */
-    fun addCard(userId: Long, cardCode: String, nickName: String)
-
     /**
      * 注册卡片
      */

+ 8 - 3
data/src/main/java/com/grkj/data/repository/IJobTicketRepository.kt

@@ -25,7 +25,7 @@ interface IJobTicketRepository {
         selectedSopPoints: List<PointManageVo>,
         selectedLockerData: List<UserManageVo>,
         selectedColockerData: List<UserManageVo>,
-        lockMode: String?,
+        modeId: Long,
         sopId: Long?,
         workstationId: Long,
         jobName: String
@@ -38,7 +38,7 @@ interface IJobTicketRepository {
         selectedSopPoints: List<PointManageVo>,
         selectedLockerData: List<UserManageVo>,
         selectedColockerData: List<UserManageVo>,
-        lockMode: String?,
+        modeId: Long,
         sopId: Long?,
         workstationId: Long,
         jobName: String,
@@ -143,7 +143,12 @@ interface IJobTicketRepository {
     /**
      * 获取正在进行中的作业数量
      */
-    fun getInProgressJobSize(workstationId: Long?, selectedLockMode: String): Int
+    fun getInProgressJobSize(workstationId: Long?, modeId: Long?): Int
+
+    /**
+     * 获取进行中的作业
+     */
+    fun getInProgressJobSize(): Int
 
     /**
      * 获取全部作业数量

+ 1 - 1
data/src/main/java/com/grkj/data/repository/ISopRepository.kt

@@ -11,7 +11,7 @@ interface ISopRepository {
     /**
      * 保存sop
      */
-    fun saveSop(sopId: Long,sopName: String, workstationId: Long, lockMode: String?): Long
+    fun saveSop(sopId: Long,sopName: String, workstationId: Long, workflowModeId: Long): Long
 
     /**
      * 保存sop点位

+ 47 - 0
data/src/main/java/com/grkj/data/repository/IWorkflowRepository.kt

@@ -0,0 +1,47 @@
+package com.grkj.data.repository
+
+import com.grkj.data.model.dos.WorkflowMode
+import com.grkj.data.model.dos.WorkflowStep
+
+/**
+ * 工作流仓储
+ */
+interface IWorkflowRepository {
+
+    fun insertStep(step: WorkflowStep): Long
+
+    fun updateStep(step: WorkflowStep)
+
+    fun deleteStep(step: WorkflowStep)
+
+    /**
+     * 获取指定模式下的所有步骤,按序号升序
+     */
+    fun getStepsByMode(modeId: Long): List<WorkflowStep>
+
+    /**
+     * 获取流程模式
+     */
+    fun getWorkflowModeByModeId(modeId: Long): WorkflowMode?
+
+    /**
+     * 获取下一个可用步骤序号
+     */
+    fun getNextStepIndex(modeId: Long): Int
+
+    /**
+     * 根据步骤id获取步骤信息
+     */
+    fun getStepById(id: Long): WorkflowStep?
+
+    /**
+     * 判定在同一模式下 "解锁" 步骤是否排在 "上锁" 步骤之前
+     * 通过比较两者的最小 step_index
+     */
+    fun isUnlockBeforeLock(modeId: Long): Boolean
+
+    /**
+     * 获取流程模式
+     */
+    fun getWorkflowModes(): List<WorkflowMode>
+}

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

@@ -26,7 +26,6 @@ import com.grkj.data.model.vo.KeyManageFilterVo
 import com.grkj.data.model.vo.LockManageFilterVo
 import com.grkj.data.model.vo.RfidTokenManageFilterVo
 import com.grkj.data.repository.BaseRepository
-import com.grkj.shared.utils.Pinyin4jUtil
 import com.sik.sikcore.data.BeanUtils
 import javax.inject.Inject
 import javax.inject.Singleton
@@ -158,15 +157,6 @@ class HardwareRepository @Inject constructor(
         callback(CommonDictDataEnum.getCommonDictRes(dictKey))
     }
 
-    override fun addCard(userId: Long, cardCode: String, nickName: String) {
-        val isJobCard = IsJobCard()
-        isJobCard.userId = userId
-        isJobCard.cardCode = cardCode
-        isJobCard.cardNfc = cardCode
-        isJobCard.userName = Pinyin4jUtil.toInitials(nickName)
-        hardwareDao.addCard(isJobCard)
-    }
-
     override fun addCardHardware(cardCode: List<String>) {
         var defaultCardCodeSize = hardwareDao.getDefaultCardNameCount()
         val isJobCard = cardCode.mapIndexed { index, cardCode ->

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov