Преглед на файлове

refactor(更新)
- 步骤和界面完善

周文健 преди 4 месеца
родител
ревизия
6921f90e7a
променени са 35 файла, в които са добавени 757 реда и са изтрити 388 реда
  1. 3 1
      app/src/main/AndroidManifest.xml
  2. 1 1
      app/src/main/java/com/grkj/iscs/features/login/activity/LoginActivity.kt
  3. 2 1
      app/src/main/java/com/grkj/iscs/features/main/activity/MainActivity.kt
  4. 56 25
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobExecuteFragment.kt
  5. 176 10
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobExecuteViewModel.kt
  6. 12 12
      app/src/main/java/com/grkj/iscs/features/splash/activity/SplashActivity.kt
  7. 4 0
      app/src/main/res/drawable/bg_common_input_disable.xml
  8. 1 1
      app/src/main/res/drawable/bg_common_input_normal.xml
  9. 0 12
      app/src/main/res/layout-land/fragment_edit_job.xml
  10. 0 12
      app/src/main/res/layout-land/fragment_edit_sop.xml
  11. 0 11
      app/src/main/res/layout-land/fragment_edit_sop_job.xml
  12. 45 19
      app/src/main/res/layout-land/fragment_job_execute.xml
  13. 245 221
      app/src/main/res/layout-land/fragment_workflow_setting.xml
  14. 3 2
      app/src/main/res/layout-land/item_home_menu.xml
  15. 26 0
      app/src/main/res/layout-land/item_job_execute_colock.xml
  16. 42 10
      app/src/main/res/layout/fragment_job_execute.xml
  17. 3 5
      app/src/main/res/layout/item_job_execute_colock.xml
  18. BIN
      app/src/main/res/mipmap-hdpi/tip.png
  19. 5 0
      app/src/main/res/values-en/strings.xml
  20. 6 3
      app/src/main/res/values-land/dimens.xml
  21. 0 3
      app/src/main/res/values-night/dimens.xml
  22. 5 0
      app/src/main/res/values-zh/strings.xml
  23. 2 2
      app/src/main/res/values/dimens.xml
  24. 6 1
      app/src/main/res/values/strings.xml
  25. 24 0
      data/src/main/java/com/grkj/data/model/dos/WorkflowStep.kt
  26. 5 3
      data/src/main/java/com/grkj/data/model/local/WorkTicketGet.kt
  27. 3 0
      data/src/main/java/com/grkj/data/repository/IJobTicketRepository.kt
  28. 3 1
      data/src/main/java/com/grkj/data/repository/impl/JobTicketRepository.kt
  29. 34 28
      ui-base/src/main/java/com/grkj/ui_base/business/BleBusinessManager.kt
  30. 1 0
      ui-base/src/main/java/com/grkj/ui_base/business/ModbusBusinessManager.kt
  31. 2 1
      ui-base/src/main/res/values-en/strings.xml
  32. 1 1
      ui-base/src/main/res/values-land/dimens.xml
  33. 2 1
      ui-base/src/main/res/values-zh/strings.xml
  34. 37 0
      ui-base/src/main/res/values/dimens.xml
  35. 2 1
      ui-base/src/main/res/values/strings.xml

+ 3 - 1
app/src/main/AndroidManifest.xml

@@ -45,12 +45,14 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
-        <activity android:name=".features.init.activity.InitActivity" />
+        <activity android:name=".features.init.activity.InitActivity"
+            android:windowSoftInputMode="stateHidden|adjustPan" />
         <activity
             android:name=".features.login.activity.LoginActivity"
             android:exported="true" />
         <activity
             android:name=".features.main.activity.MainActivity"
+            android:windowSoftInputMode="stateHidden|adjustPan"
             android:exported="true" />
 
         <receiver

+ 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 - 1
app/src/main/java/com/grkj/iscs/features/main/activity/MainActivity.kt

@@ -22,6 +22,7 @@ import com.grkj.ui_base.base.BaseActivity
 import com.grkj.ui_base.utils.event.BottomNavVisibilityEvent
 import com.grkj.shared.utils.extension.toByteArrays
 import com.grkj.shared.utils.extension.toHexStrings
+import com.grkj.ui_base.utils.event.RFIDCardReadEvent
 import dagger.hilt.android.AndroidEntryPoint
 
 /**
@@ -133,7 +134,7 @@ class MainActivity() : BaseActivity<ActivityMainBinding>() {
                 logger.info("Swipe card login Origin: $cardNo")
                 cardNo = cardNo.toLong().toByteArrays().toHexStrings(false)
                 logger.info("Swipe card login: $cardNo")
-
+                RFIDCardReadEvent.sendRFIDCardReadEvent(cardNo)
                 // 重置cardNo
                 cardNo = ""
                 return super.dispatchKeyEvent(event)

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

@@ -45,14 +45,20 @@ import kotlin.getValue
 @AndroidEntryPoint
 class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
     private val viewModel: JobExecuteViewModel by viewModels()
-
+    private var currentTab: Int = 0
     override fun getLayoutId(): Int {
         return R.layout.fragment_job_execute
     }
 
     override fun initView() {
         binding.back.setDebouncedClickListener {
-            navController.popBackStack()
+            if ((binding.dataLayout.parent as ViewGroup).id == binding.fullScreenRootLayout.id) {
+                binding.spaceView.isVisible = false
+                toggleExpandView(binding.fullScreenRootLayout, binding.dataLayout, true)
+                binding.fullScreen.isVisible = true
+            } else {
+                navController.popBackStack()
+            }
         }
         binding.listRv.linear().setup {
             addType<IsJobTicketPointsDataVo>(R.layout.item_job_execute_point)
@@ -107,11 +113,9 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
             }
         }
         binding.fullScreen.setDebouncedClickListener {
-            if ((binding.dataLayout.parent as ViewGroup).id == binding.fullScreenRootLayout.id) {
-                toggleExpandView(binding.fullScreenRootLayout, binding.dataLayout, true)
-            } else {
-                toggleExpandView(binding.fullScreenRootLayout, binding.dataLayout, false)
-            }
+            toggleExpandView(binding.fullScreenRootLayout, binding.dataLayout, false)
+            binding.fullScreen.isVisible = false
+            binding.spaceView.isVisible = true
         }
         binding.descriptionTab.setDebouncedClickListener {
             checkLayout(0)
@@ -128,6 +132,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
      * 检查界面
      */
     private fun checkLayout(index: Int) {
+        currentTab = index
         binding.descriptionTab.isSelected = index == 0
         binding.lockerTab.isSelected = index == 1
         binding.colockerTab.isSelected = index == 2
@@ -182,7 +187,11 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
             }
             val workflowStep =
                 viewModel.workflowSteps.find { it.stepId == item.workflowStepId }
-            if (workflowStep?.confirmType == 0 &&
+            if (workflowStep?.confirmType != 0 &&
+                (workflowStep?.enableSetLocker == true || workflowStep?.enableSetColocker == true)
+            ) {
+                stepClickConfirm(adapter, item, workflowStep)
+            } else if (workflowStep?.confirmType == 0 &&
                 workflowStep.confirmRoleCode == null &&
                 workflowStep.confirmUser == null
             ) {
@@ -202,7 +211,11 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
             ) {
                 stepClickConfirm(adapter, item, workflowStep)
             } else {
-                PopTip.tip(com.grkj.ui_base.R.string.no_permission_to_handle)
+                val errorTipData = viewModel.getStepErrorTip(workflowStep)
+                PopTip.tip(errorTipData.first)
+                errorTipData.second?.let {
+                    checkLayout(it)
+                }
             }
         }
     }
@@ -224,6 +237,8 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                             if (it == false) {
                                 PopTip.tip(R.string.step_confirm_failed)
                             } else {
+                                logger.info("点击更新步骤状态完成")
+                                checkLayout(0)
                                 checkCurrentStep()
                             }
                             adapter.notifyDataSetChanged()
@@ -351,20 +366,26 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         super.onEvent(event)
         when (event.code) {
             EventConstants.EVENT_RFID_CARD_READ -> {
+                checkLayout(2)
                 (event.data as RFIDCardReadEvent).let {
-                    logger.info("读卡器获取卡片RFID:${it.rfidNo}")
-                    if (viewModel.workflowSteps.find { it.stepId == viewModel.currentStepData?.workflowStepId }?.enableColock == true &&
-                        viewModel.ticketPoints.none { it.pointStatus == "0" }
+                    val currentWorkflowStep =
+                        viewModel.workflowSteps.find { it.stepId == viewModel.currentStepData?.workflowStepId }
+                    //当前步骤能加共锁并且锁已经上锁或者当前步骤能解共锁并且锁已经上锁
+                    if ((currentWorkflowStep?.enableColock == true || currentWorkflowStep?.enableReleaseColock == true) &&
+                        viewModel.ticketPoints.all { it.pointStatus == "1" }
                     ) {
                         viewModel.getUserIdByCardRfid(it.rfidNo).observe(this) { userId ->
                             userId?.let {
                                 val isJobCardUser =
                                     viewModel.ticketUser.find { it.userId == userId }
                                 isJobCardUser?.let { colocker ->
-                                    if (colocker.jobStatus == "0") {
+                                    if (colocker.jobStatus == "0" && currentWorkflowStep.enableColock) {
                                         logger.info("添加共锁")
                                         TipDialog.showInfo(
-                                            msg = CommonUtils.getStr(com.grkj.ui_base.R.string.confirm_to_colock)
+                                            msg = CommonUtils.getStr(
+                                                com.grkj.ui_base.R.string.confirm_to_colock,
+                                                colocker.nickName
+                                            )
                                                 .toString(), countDownTime = 10, onConfirmClick = {
                                                 colocker.jobStatus = "1"
                                                 viewModel.colockerStatusChange(colocker)
@@ -378,10 +399,13 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                                                         refreshTicketUser()
                                                     }
                                             })
-                                    } else if (colocker.jobStatus == "1") {
+                                    } else if (colocker.jobStatus == "1" && currentWorkflowStep.enableReleaseColock) {
                                         logger.info("解除共锁")
                                         TipDialog.showInfo(
-                                            msg = CommonUtils.getStr(com.grkj.ui_base.R.string.confirm_to_uncolock)
+                                            msg = CommonUtils.getStr(
+                                                com.grkj.ui_base.R.string.confirm_to_uncolock,
+                                                colocker.nickName
+                                            )
                                                 .toString(), countDownTime = 10, onConfirmClick = {
                                                 colocker.jobStatus = "2"
                                                 viewModel.colockerStatusChange(colocker)
@@ -408,6 +432,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
             }
 
             EventConstants.EVENT_UPDATE_TICKET_PROGRESS -> {
+                checkLayout(1)
                 getData()
             }
 
@@ -431,17 +456,24 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
     private fun checkStepComplete() {
         val workflowStep =
             viewModel.workflowSteps.find { it.stepId == viewModel.currentStepData?.workflowStepId }
-        if (viewModel.stepConditionsComplete(workflowStep)) {
+        if (viewModel.stepConditionsComplete(workflowStep) && workflowStep?.confirmType == 0) {
+            viewModel.currentStepData = viewModel.ticketStep.firstOrNull { it.stepStatus == "0" }
+            logger.info("当前步骤数据:${viewModel.currentStepData}")
             viewModel.currentStepData?.let {
+                it.stepStatus = "1"
                 viewModel.updateStepStatus(it).observe(this@JobExecuteFragment) {
                     if (it == false) {
                         PopTip.tip(R.string.step_confirm_failed)
                     } else {
-                        checkCurrentStep()
+                        logger.info("检查更新步骤状态完成")
                     }
+                    checkCurrentStep()
                     binding.stepRv.adapter?.notifyDataSetChanged()
                 }
             }
+        } else {
+            checkCurrentStep()
+            binding.stepRv.adapter?.notifyDataSetChanged()
         }
     }
 
@@ -453,9 +485,14 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         binding.toUnlock.isVisible = false
         binding.cancelJob.isVisible = false
         binding.finishJob.isVisible = false
+        binding.stepTipTv.isVisible = viewModel.needShowTip()
         if (viewModel.currentStepData?.stepIndex == null) {
             binding.finishJob.isVisible = true
         } else {
+            binding.lockInfo.text =
+                "${viewModel.ticketPoints.size}/${viewModel.ticketPoints.count { it.pointStatus?.toInt() ?: 0 >= 1 }}/${viewModel.ticketPoints.count { it.pointStatus == "2" }}"
+            binding.colockInfo.text =
+                "${viewModel.ticketUser.filter { it.userRole == RoleEnum.JTCOLOCKER.roleKey }.size}/${viewModel.ticketUser.count { it.userRole == RoleEnum.JTCOLOCKER.roleKey && it.jobStatus?.toInt() ?: 0 >= 1 }}/${viewModel.ticketUser.count { it.userRole == RoleEnum.JTCOLOCKER.roleKey && it.jobStatus == "2" }}"
             val currentStep =
                 viewModel.workflowSteps.find { it.stepId == viewModel.currentStepData?.workflowStepId }
             when {
@@ -512,11 +549,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                         viewModel.workflowSteps.find { it.stepId == viewModel.currentStepData?.workflowStepId }?.stepDescription
                     refreshTicketUser()
                     checkCurrentStep()
-                    binding.lockInfo.text =
-                        "${viewModel.ticketPoints.size}/${viewModel.ticketPoints.count { it.pointStatus == "1" }}/${viewModel.ticketPoints.count { it.pointStatus == "2" }}"
-                    binding.colockInfo.text =
-                        "${viewModel.ticketUser.filter { it.userRole == RoleEnum.JTCOLOCKER.roleKey }.size}/${viewModel.ticketUser.count { it.userRole == RoleEnum.JTCOLOCKER.roleKey && it.jobStatus == "1" }}/${viewModel.ticketUser.count { it.userRole == RoleEnum.JTCOLOCKER.roleKey && it.jobStatus == "2" }}"
-                    checkLayout(0)
+                    checkLayout(currentTab)
                 }
             } else {
                 TipDialog.showError(
@@ -584,8 +617,6 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                     (workflowStep?.enableSetLocker == true || workflowStep?.enableSetColocker == true)
                 ) {
                     viewModel.currentStepData?.stepStatus = "1"
-                    viewModel.currentStepData =
-                        viewModel.ticketStep.firstOrNull { it.stepStatus == "0" }
                     viewModel.currentStepData?.let {
                         viewModel.updateStepStatus(it).observe(this@JobExecuteFragment) {
                             if (it == false) {

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

@@ -83,7 +83,6 @@ class JobExecuteViewModel @Inject constructor(
             selecteColockerData =
                 tempJobTicketUserId.filter { it.roleKeys.contains(RoleEnum.JTCOLOCKER.roleKey) }
             ticketStep.sortedBy { it.stepIndex }
-            currentStepData = ticketStep.firstOrNull()
             emit(true)
         }
     }
@@ -97,7 +96,6 @@ class JobExecuteViewModel @Inject constructor(
                 ticketData!!.ticketId, currentStepData, selectedLockerData, selecteColockerData
             )
             ticketStep = jobTicketRepository.getJobTicketStepDataByTicketId(ticketId)
-            val workflowSteps = workflowRepository.getStepsByMode(ticketData!!.modeId)
             val currentWorkflowStep = workflowSteps.find {
                 it.stepId == ticketStep.firstOrNull { it.stepStatus == "0" }?.workflowStepId
             }
@@ -305,16 +303,16 @@ class JobExecuteViewModel @Inject constructor(
         return liveData(Dispatchers.IO) {
             workflowSteps = workflowRepository.getStepsByMode(modeId)
             for (stepDataVo in ticketStep) {
-                currentStepData = stepDataVo
                 val workflowStep = workflowSteps.find { it.stepId == stepDataVo.workflowStepId }
                 //如果是自动确认并且没有操作的功能,则更新步骤
                 if (workflowStep?.confirmType != 0 && workflowStep?.hasAnyOperationFunction() == false) {
                     stepDataVo.stepStatus = "1"
                     BeanUtils.copyProperties(
                         stepDataVo, IsJobTicketStep::class.java
-                    )?.let {
-                        jobTicketRepository.updateTicketStepData(it)
-                        val workflowSteps = workflowRepository.getStepsByMode(ticketData!!.modeId)
+                    )?.let { jobTicketStep ->
+                        jobTicketRepository.updateTicketStepData(jobTicketStep)
+                        currentStepData =
+                            ticketStep.find { it.stepIndex == jobTicketStep.stepIndex + 1 }
                         val currentWorkflowStep = workflowSteps.find {
                             it.stepId == ticketStep.firstOrNull { it.stepStatus == "0" }?.workflowStepId
                         }
@@ -351,9 +349,8 @@ class JobExecuteViewModel @Inject constructor(
                 jobTicketStepDataVo, IsJobTicketStep::class.java
             )
             ticketStepData?.let {
-                currentStepData = ticketStep.find { it.stepIndex == ticketStepData.stepIndex + 1 }
                 jobTicketRepository.updateTicketStepData(it)
-                val workflowSteps = workflowRepository.getStepsByMode(ticketData!!.modeId)
+                currentStepData = ticketStep.find { it.stepIndex == ticketStepData.stepIndex + 1 }
                 val currentWorkflowStep = workflowSteps.find {
                     it.stepId == currentStepData?.workflowStepId
                 }
@@ -369,6 +366,7 @@ class JobExecuteViewModel @Inject constructor(
      * 上锁步骤是否上锁完成
      */
     private fun lockStepLocked(workflowStep: WorkflowStep?): Boolean {
+        logger.info("上锁条件:${workflowStep?.enableLock},${ticketPoints.all { it.pointStatus == "1" }}")
         return workflowStep?.enableLock == true && ticketPoints.all { it.pointStatus == "1" }
     }
 
@@ -376,20 +374,47 @@ class JobExecuteViewModel @Inject constructor(
      * 共锁步骤是否共锁完成
      */
     private fun coLockStepLocked(workflowStep: WorkflowStep?): Boolean {
-        return workflowStep?.enableColock == true && ticketUser.all { it.jobStatus == "1" }
+        logger.info(
+            "共锁条件:${workflowStep?.enableColock},${
+                ticketUser.filter {
+                    it.userRole?.contains(
+                        RoleEnum.JTCOLOCKER.roleKey
+                    ) == true
+                }.all { it.jobStatus == "1" }
+            }"
+        )
+        return workflowStep?.enableColock == true && ticketUser.filter {
+            it.userRole?.contains(
+                RoleEnum.JTCOLOCKER.roleKey
+            ) == true
+        }.all { it.jobStatus == "1" }
     }
 
     /**
      * 解除共锁步骤是否解锁完成
      */
     private fun releaseCoLockStepUnLocked(workflowStep: WorkflowStep?): Boolean {
-        return workflowStep?.enableReleaseColock == true && ticketUser.all { it.jobStatus == "2" }
+        logger.info(
+            "解除共锁条件:${workflowStep?.enableReleaseColock},${
+                ticketUser.filter {
+                    it.userRole?.contains(
+                        RoleEnum.JTCOLOCKER.roleKey
+                    ) == true
+                }.all { it.jobStatus == "2" }
+            }"
+        )
+        return workflowStep?.enableReleaseColock == true && ticketUser.filter {
+            it.userRole?.contains(
+                RoleEnum.JTCOLOCKER.roleKey
+            ) == true
+        }.all { it.jobStatus == "2" }
     }
 
     /**
      * 解锁步骤是否解锁完成
      */
     private fun unLockStepLocked(workflowStep: WorkflowStep?): Boolean {
+        logger.info("解锁条件:${workflowStep?.enableUnlock},${ticketPoints.all { it.pointStatus == "2" }}")
         return workflowStep?.enableUnlock == true && ticketPoints.all { it.pointStatus == "2" }
     }
 
@@ -398,10 +423,33 @@ class JobExecuteViewModel @Inject constructor(
      */
     fun stepConditionsComplete(workflowStep: WorkflowStep?): Boolean {
         return when {
+            //一个步骤4个状态
+            workflowStep?.enableLock == true && workflowStep.enableColock && workflowStep.enableUnlock == true && workflowStep.enableReleaseColock -> lockStepLocked(
+                workflowStep
+            ) && coLockStepLocked(workflowStep) && releaseCoLockStepUnLocked(workflowStep) && unLockStepLocked(
+                workflowStep
+            )
+            //上锁、共锁、解除共锁一个步骤
+            workflowStep?.enableLock == true && workflowStep.enableColock && workflowStep.enableReleaseColock -> lockStepLocked(
+                workflowStep
+            ) && coLockStepLocked(workflowStep) && releaseCoLockStepUnLocked(workflowStep)
+            //共锁、解除共锁、解锁一个步骤
+            workflowStep?.enableColock == true && workflowStep.enableUnlock == true && workflowStep.enableReleaseColock -> coLockStepLocked(
+                workflowStep
+            ) && releaseCoLockStepUnLocked(workflowStep) && unLockStepLocked(
+                workflowStep
+            )
+            //上锁、解锁一个步骤
+            workflowStep?.enableLock == true && workflowStep.enableUnlock == true -> lockStepLocked(
+                workflowStep
+            ) && unLockStepLocked(workflowStep)
+
+            //上锁、共锁一个步骤
             workflowStep?.enableLock == true && workflowStep.enableColock == true -> lockStepLocked(
                 workflowStep
             ) && coLockStepLocked(workflowStep)
 
+            //解除共锁、解锁一个步骤
             workflowStep?.enableUnlock == true && workflowStep.enableReleaseColock == true -> unLockStepLocked(
                 workflowStep
             ) && releaseCoLockStepUnLocked(workflowStep)
@@ -414,4 +462,122 @@ class JobExecuteViewModel @Inject constructor(
             else -> false
         }
     }
+
+    /**
+     * 获取步骤错误提示
+     */
+    fun getStepErrorTip(workflowStep: WorkflowStep?): Pair<String, Int?> {
+        return when {
+            workflowStep?.enableLock == true -> {
+                return if (ticketPoints.any { it.pointStatus == "0" }) {
+                    CommonUtils.getStr(
+                        R.string.has_lock_not_locked,
+                        ticketPoints.filter { it.pointStatus == "0" }.map { it.pointName })
+                        .toString() to null
+                } else if (workflowStep.enableColock == true && ticketUser.filter { it.userRole == RoleEnum.JTCOLOCKER.roleKey }
+                        .any { it.jobStatus == "0" }) {
+                    CommonUtils.getStr(R.string.please_complete_colock).toString() to 2
+                } else {
+                    CommonUtils.getStr(com.grkj.ui_base.R.string.no_permission_to_handle)
+                        .toString() to null
+                }
+            }
+
+            workflowStep?.enableColock == true -> {
+                if (ticketUser.filter { it.userRole == RoleEnum.JTCOLOCKER.roleKey }
+                        .any { it.jobStatus != "1" }) {
+                    CommonUtils.getStr(R.string.please_complete_colock).toString() to 2
+                } else {
+                    CommonUtils.getStr(com.grkj.ui_base.R.string.no_permission_to_handle)
+                        .toString() to null
+                }
+            }
+
+            workflowStep?.enableReleaseColock == true -> {
+                if (ticketUser.filter { it.userRole == RoleEnum.JTCOLOCKER.roleKey }
+                        .any { it.jobStatus != "2" }) {
+                    CommonUtils.getStr(
+                        R.string.has_lock_not_unlocked,
+                        ticketPoints.filter { it.pointStatus == "2" }.map { it.pointName })
+                        .toString() to 2
+                } else {
+                    CommonUtils.getStr(com.grkj.ui_base.R.string.no_permission_to_handle)
+                        .toString() to null
+                }
+            }
+
+            workflowStep?.enableUnlock == true -> {
+                if (ticketPoints.any { it.pointStatus != "2" }) {
+                    CommonUtils.getStr(R.string.has_lock_not_locked).toString() to 2
+                } else {
+                    CommonUtils.getStr(com.grkj.ui_base.R.string.no_permission_to_handle)
+                        .toString() to null
+                }
+            }
+
+            else -> CommonUtils.getStr(com.grkj.ui_base.R.string.no_permission_to_handle)
+                .toString() to null
+        }
+    }
+
+    /**
+     * 是否需要显示提示
+     */
+    fun needShowTip(): Boolean {
+        val currentWorkflowStep =
+            workflowSteps.find { it.stepId == currentStepData?.workflowStepId }
+        return currentWorkflowStep?.enableSetLocker == true || currentWorkflowStep?.enableSetColocker == true ||
+                currentWorkflowStep?.enableLock == true || currentWorkflowStep?.enableColock == true ||
+                currentWorkflowStep?.enableReleaseColock == true || currentWorkflowStep?.enableUnlock == true
+    }
+
+    /**
+     * 获取当前步骤的提示
+     */
+    fun getCurrentStepTip(): String {
+        val currentWorkflowStep =
+            workflowSteps.find { it.stepId == currentStepData?.workflowStepId }
+        return when {
+            currentWorkflowStep?.enableSetLocker == true || currentWorkflowStep?.enableSetColocker == true -> {
+                CommonUtils.getStr(R.string.please_select_member).toString()
+            }
+
+            currentWorkflowStep?.enableLock == true || currentWorkflowStep?.enableColock == true ||
+                    currentWorkflowStep?.enableReleaseColock == true || currentWorkflowStep?.enableUnlock == true -> {
+                var tip = ""
+                if (currentWorkflowStep.enableLock) {
+                    if (ticketPoints.any { it.pointStatus != "1" } && ticketKey.isEmpty()) {
+                        tip = CommonUtils.getStr(com.grkj.ui_base.R.string.please_go_locking)
+                            .toString()
+                    } else if (ticketPoints.any { it.pointStatus != "1" } && ticketKey.filter { it.ticketType == 0L }
+                            .any { it.collectTime.isNullOrEmpty() }) {
+                        tip =
+                            CommonUtils.getStr(com.grkj.ui_base.R.string.please_return_key_after_locking)
+                                .toString()
+                    }
+                }
+                if (currentWorkflowStep.enableColock && ticketUser.any { it.jobStatus != "1" }) {
+                    tip = CommonUtils.getStr(R.string.please_do_colock).toString()
+                }
+                if (currentWorkflowStep.enableReleaseColock && ticketUser.any { it.jobStatus != "2" }) {
+                    tip =
+                        CommonUtils.getStr(com.grkj.ui_base.R.string.please_do_uncolock).toString()
+                }
+                if (currentWorkflowStep.enableUnlock && ticketUser.all { it.jobStatus == "2" }) {
+                    if (ticketPoints.any { it.pointStatus != "2" }) {
+                        tip = CommonUtils.getStr(com.grkj.ui_base.R.string.please_do_uncolock)
+                            .toString()
+                    } else if (ticketPoints.any { it.pointStatus != "2" } && ticketKey.filter { it.ticketType == 1L }
+                            .any { it.collectTime.isNullOrEmpty() }) {
+                        tip =
+                            CommonUtils.getStr(com.grkj.ui_base.R.string.please_return_key_after_unlocking)
+                                .toString()
+                    }
+                }
+                tip
+            }
+
+            else -> ""
+        }
+    }
 }

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

@@ -38,19 +38,19 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
         DialogX.titleTextInfo = dialogXTextInfo
         StartModbusEvent.sendStartModbusEvent()
         //todo 测试用,直接进入,不初始化
-        viewModel.checkSysMenuAndRole().observe(this) {
-            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()
+            }
+        }
     }
 }

+ 4 - 0
app/src/main/res/drawable/bg_common_input_disable.xml

@@ -1,4 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <shape xmlns:android="http://schemas.android.com/apk/res/android">
     <solid android:color="@color/common_selected_gray" />
+    <stroke
+        android:width="@dimen/divider_line_space"
+        android:color="@color/black" />
+    <corners android:radius="4dp" />
 </shape>

+ 1 - 1
app/src/main/res/drawable/bg_common_input_normal.xml

@@ -3,6 +3,6 @@
     <stroke
         android:width="@dimen/divider_line_space"
         android:color="@color/black" />
-    <solid android:color="@color/white" />
     <corners android:radius="4dp" />
+    <solid android:color="@color/white" />
 </shape>

+ 0 - 12
app/src/main/res/layout-land/fragment_edit_job.xml

@@ -241,18 +241,6 @@
                             android:layout_height="match_parent"
                             android:scrollbars="horizontal"
                             android:paddingHorizontal="@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>

+ 0 - 12
app/src/main/res/layout-land/fragment_edit_sop.xml

@@ -235,18 +235,6 @@
                             android:layout_height="match_parent"
                             android:scrollbars="horizontal"
                             android:paddingHorizontal="@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>

+ 0 - 11
app/src/main/res/layout-land/fragment_edit_sop_job.xml

@@ -237,17 +237,6 @@
                             android:scrollbars="horizontal"
                             android:paddingHorizontal="@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>

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

@@ -73,7 +73,6 @@
                     android:layout_marginHorizontal="@dimen/common_spacing"
                     android:layout_marginTop="@dimen/common_spacing_2x" />
 
-
                 <LinearLayout
                     android:layout_width="match_parent"
                     android:layout_height="60dp"
@@ -103,8 +102,8 @@
                         android:id="@+id/locker_tab"
                         android:layout_width="0dp"
                         android:layout_height="match_parent"
-                        android:background="@drawable/bg_common_select"
-                        android:layout_weight="1">
+                        android:layout_weight="1"
+                        android:background="@drawable/bg_common_select">
 
                         <TextView
                             android:id="@+id/lock_tv"
@@ -118,10 +117,10 @@
 
                         <ImageView
                             android:id="@+id/lock_iv"
-                            android:layout_width="wrap_content"
-                            android:layout_height="wrap_content"
+                            android:layout_width="@dimen/job_execute_tab_icon_size"
+                            android:layout_height="@dimen/job_execute_tab_icon_size"
                             android:layout_centerInParent="true"
-                            android:paddingHorizontal="@dimen/common_spacing"
+                            android:layout_marginHorizontal="5dp"
                             android:src="@mipmap/icon_job_execute_lock" />
 
                         <TextView
@@ -133,13 +132,12 @@
                             android:textSize="@dimen/common_text_size" />
                     </RelativeLayout>
 
-
                     <RelativeLayout
                         android:id="@+id/colocker_tab"
                         android:layout_width="0dp"
                         android:layout_height="match_parent"
-                        android:background="@drawable/bg_common_select"
-                        android:layout_weight="1">
+                        android:layout_weight="1"
+                        android:background="@drawable/bg_common_select">
 
                         <TextView
                             android:id="@+id/colock_tv"
@@ -153,10 +151,10 @@
 
                         <ImageView
                             android:id="@+id/colock_iv"
-                            android:layout_width="wrap_content"
-                            android:layout_height="wrap_content"
+                            android:layout_width="@dimen/job_execute_tab_icon_size"
+                            android:layout_height="@dimen/job_execute_tab_icon_size"
                             android:layout_centerInParent="true"
-                            android:paddingHorizontal="@dimen/common_spacing"
+                            android:layout_marginHorizontal="5dp"
                             android:src="@mipmap/icon_job_execute_colock" />
 
                         <TextView
@@ -169,6 +167,18 @@
                     </RelativeLayout>
                 </LinearLayout>
 
+                <TextView
+                    android:id="@+id/step_tip_tv"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="@dimen/common_spacing_2x"
+                    android:layout_marginTop="@dimen/common_spacing"
+                    android:gravity="center_vertical"
+                    android:drawableLeft="@mipmap/tip"
+                    android:textColor="@color/black"
+                    android:textSize="@dimen/common_text_size"
+                    android:visibility="gone" />
+
                 <LinearLayout
                     android:id="@+id/data_layout"
                     android:layout_width="match_parent"
@@ -183,8 +193,10 @@
 
                     <RelativeLayout
                         android:layout_width="match_parent"
-                        android:layout_height="50dp"
-                        android:background="@drawable/common_card_bg">
+                        android:layout_height="wrap_content"
+                        android:background="@drawable/common_layout_bg"
+                        android:elevation="@dimen/elevation_3"
+                        android:paddingVertical="@dimen/common_spacing">
 
                         <TextView
                             android:id="@+id/data_title_tv"
@@ -212,12 +224,13 @@
                             android:id="@+id/lock_status_layout"
                             android:layout_width="match_parent"
                             android:layout_height="match_parent"
-                            android:orientation="vertical">
+                            android:orientation="vertical"
+                            android:visibility="gone">
 
                             <LinearLayout
                                 android:layout_width="match_parent"
-                                android:layout_height="@dimen/point_header_height"
-                                android:background="@drawable/common_card_bg"
+                                android:layout_height="wrap_content"
+                                android:background="@drawable/common_layout_bg"
                                 android:divider="@drawable/divider_table"
                                 android:showDividers="middle">
 
@@ -226,6 +239,7 @@
                                     android:layout_height="match_parent"
                                     android:layout_weight="1"
                                     android:gravity="center"
+                                    android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/point_name_tv"
                                     android:textSize="@dimen/common_text_size" />
 
@@ -234,6 +248,7 @@
                                     android:layout_height="match_parent"
                                     android:layout_weight="1"
                                     android:gravity="center"
+                                    android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/point_manage_point_function"
                                     android:textSize="@dimen/common_text_size" />
 
@@ -242,6 +257,7 @@
                                     android:layout_height="match_parent"
                                     android:layout_weight="1"
                                     android:gravity="center"
+                                    android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/lock_status"
                                     android:textSize="@dimen/common_text_size" />
                             </LinearLayout>
@@ -250,7 +266,7 @@
                                 android:id="@+id/list_rv"
                                 android:layout_width="match_parent"
                                 android:layout_height="match_parent"
-                                android:background="@drawable/common_card_bg" />
+                                android:background="@drawable/common_layout_bg" />
                         </LinearLayout>
 
                         <LinearLayout
@@ -264,7 +280,7 @@
 
                             <LinearLayout
                                 android:layout_width="match_parent"
-                                android:layout_height="@dimen/colocker_layout_height"
+                                android:layout_height="wrap_content"
                                 android:background="@drawable/common_layout_bg"
                                 android:divider="@drawable/divider_table"
                                 android:showDividers="middle">
@@ -275,6 +291,7 @@
                                     android:layout_height="match_parent"
                                     android:layout_weight="1"
                                     android:gravity="center"
+                                    android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/wait_to_colock"
                                     android:textSize="@dimen/common_text_size" />
 
@@ -284,6 +301,7 @@
                                     android:layout_height="match_parent"
                                     android:layout_weight="1"
                                     android:gravity="center"
+                                    android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/already_colock"
                                     android:textSize="@dimen/common_text_size" />
 
@@ -293,6 +311,7 @@
                                     android:layout_height="match_parent"
                                     android:layout_weight="1"
                                     android:gravity="center"
+                                    android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/already_uncolock"
                                     android:textSize="@dimen/common_text_size" />
                             </LinearLayout>
@@ -335,6 +354,13 @@
                             android:textSize="@dimen/common_text_size"
                             android:visibility="gone" />
                     </FrameLayout>
+
+                    <View
+                        android:id="@+id/space_view"
+                        android:layout_width="1dp"
+                        android:layout_height="0dp"
+                        android:layout_weight="1"
+                        android:visibility="gone" />
                 </LinearLayout>
 
                 <LinearLayout

+ 245 - 221
app/src/main/res/layout-land/fragment_workflow_setting.xml

@@ -93,234 +93,258 @@
                 android:layout_width="match_parent"
                 android:layout_height="@dimen/step_rv_height"
                 android:layout_marginHorizontal="@dimen/common_spacing"
-                android:layout_marginTop="@dimen/common_spacing_2x"
-                android:visibility="gone" />
+                android:layout_marginTop="@dimen/common_spacing_2x" />
 
-
-            <androidx.constraintlayout.widget.ConstraintLayout
+            <LinearLayout
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
+                android:orientation="horizontal"
                 android:padding="@dimen/common_spacing">
 
-                <androidx.constraintlayout.widget.Barrier
-                    android:id="@+id/barrier_title_end"
-                    android:layout_width="0dp"
-                    android:layout_height="0dp"
-                    app:barrierDirection="end"
-                    app:constraint_referenced_ids="step_title_tv,step_title_short_tv,step_confirm_type_tv,step_confirm_role_tv,step_confirm_member_tv,step_function_tv,step_description_tv" />
-
-                <com.grkj.ui_base.widget.RequiredTextView
-                    android:id="@+id/step_title_tv"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_marginVertical="@dimen/common_spacing_2x"
-                    android:text="@string/workflow_step_title"
-                    android:textSize="@dimen/normal_text_size_18"
-                    android:textStyle="bold"
-                    app:layout_constraintEnd_toEndOf="@+id/barrier_title_end"
-                    app:layout_constraintTop_toTopOf="parent"
-                    app:markPosition="end"
-                    app:required="true" />
-
-                <EditText
-                    android:id="@+id/step_title_et"
-                    android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    android:layout_marginHorizontal="@dimen/common_spacing"
-                    android:background="@drawable/bg_common_input"
-                    android:hint="@string/please_input_step_title"
-                    android:maxLines="1"
-                    android:paddingHorizontal="@dimen/common_spacing"
-                    android:paddingVertical="5dp"
-                    android:singleLine="true"
-                    android:textSize="@dimen/normal_text_size_18"
-                    android:textStyle="bold"
-                    app:layout_constraintBottom_toBottomOf="@+id/step_title_tv"
-                    app:layout_constraintStart_toEndOf="@+id/barrier_title_end"
-                    app:layout_constraintTop_toTopOf="@+id/step_title_tv" />
-
-                <com.grkj.ui_base.widget.RequiredTextView
-                    android:id="@+id/step_title_short_tv"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_marginVertical="@dimen/common_spacing_2x"
-                    android:text="@string/workflow_step_title_short"
-                    android:textSize="@dimen/normal_text_size_18"
-                    android:textStyle="bold"
-                    app:layout_constraintEnd_toEndOf="@+id/barrier_title_end"
-                    app:layout_constraintTop_toBottomOf="@+id/step_title_tv"
-                    app:markPosition="end"
-                    app:required="true" />
-
-                <EditText
-                    android:id="@+id/step_title_short_et"
-                    android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    android:layout_marginHorizontal="@dimen/common_spacing"
-                    android:background="@drawable/bg_common_input"
-                    android:hint="@string/please_input_step_title_short"
-                    android:maxLines="1"
-                    android:paddingHorizontal="@dimen/common_spacing"
-                    android:paddingVertical="5dp"
-                    android:singleLine="true"
-                    android:textSize="@dimen/normal_text_size_18"
-                    android:textStyle="bold"
-                    app:layout_constraintBottom_toBottomOf="@+id/step_title_short_tv"
-                    app:layout_constraintStart_toEndOf="@+id/barrier_title_end"
-                    app:layout_constraintTop_toTopOf="@+id/step_title_short_tv" />
-
-                <com.grkj.ui_base.widget.RequiredTextView
-                    android:id="@+id/step_confirm_type_tv"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_marginVertical="@dimen/common_spacing_2x"
-                    android:text="@string/workflow_step_confirm_type"
-                    android:textSize="@dimen/normal_text_size_18"
-                    android:textStyle="bold"
-                    app:layout_constraintEnd_toEndOf="@+id/barrier_title_end"
-                    app:layout_constraintTop_toBottomOf="@+id/step_title_short_tv"
-                    app:markPosition="end"
-                    app:required="true" />
-
-                <TextView
-                    android:id="@+id/step_confirm_type"
+                <androidx.core.widget.NestedScrollView
                     android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    android:layout_marginHorizontal="@dimen/common_spacing"
-                    android:background="@drawable/bg_common_input"
-                    android:drawableRight="@mipmap/icon_drop_down"
-                    android:hint="@string/please_select_step_confirm_type"
-                    android:maxLines="1"
-                    android:paddingHorizontal="@dimen/common_spacing"
-                    android:paddingVertical="5dp"
-                    android:singleLine="true"
-                    android:textSize="@dimen/normal_text_size_18"
-                    android:textStyle="bold"
-                    app:layout_constraintBottom_toBottomOf="@+id/step_confirm_type_tv"
-                    app:layout_constraintStart_toEndOf="@+id/barrier_title_end"
-                    app:layout_constraintTop_toTopOf="@+id/step_confirm_type_tv" />
-
-                <com.grkj.ui_base.widget.RequiredTextView
-                    android:id="@+id/step_confirm_role_tv"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_marginVertical="@dimen/common_spacing_2x"
-                    android:text="@string/workflow_step_confirm_role"
-                    android:textSize="@dimen/normal_text_size_18"
-                    android:textStyle="bold"
-                    android:visibility="gone"
-                    app:layout_constraintEnd_toEndOf="@+id/barrier_title_end"
-                    app:layout_constraintTop_toBottomOf="@+id/step_confirm_type_tv"
-                    app:markPosition="end"
-                    app:required="true" />
-
-                <TextView
-                    android:id="@+id/step_confirm_role"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:fillViewport="true">
+
+                    <androidx.constraintlayout.widget.ConstraintLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent">
+
+                        <androidx.constraintlayout.widget.Barrier
+                            android:id="@+id/barrier_title_end_land"
+                            android:layout_width="0dp"
+                            android:layout_height="0dp"
+                            app:barrierDirection="end"
+                            app:constraint_referenced_ids="step_title_tv,step_title_short_tv,step_confirm_type_tv,step_confirm_role_tv,step_confirm_member_tv,step_function_tv" />
+
+                        <com.grkj.ui_base.widget.RequiredTextView
+                            android:id="@+id/step_title_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginVertical="@dimen/common_spacing_2x"
+                            android:text="@string/workflow_step_title"
+                            android:textSize="@dimen/normal_text_size_18"
+                            android:textStyle="bold"
+                            app:layout_constraintEnd_toEndOf="@+id/barrier_title_end_land"
+                            app:layout_constraintTop_toTopOf="parent"
+                            app:markPosition="end"
+                            app:required="true" />
+
+                        <EditText
+                            android:id="@+id/step_title_et"
+                            android:layout_width="0dp"
+                            android:layout_height="wrap_content"
+                            android:layout_marginHorizontal="@dimen/common_spacing"
+                            android:background="@drawable/bg_common_input"
+                            android:hint="@string/please_input_step_title"
+                            android:maxLines="1"
+                            android:paddingHorizontal="@dimen/common_spacing"
+                            android:paddingVertical="5dp"
+                            android:singleLine="true"
+                            android:textSize="@dimen/normal_text_size_18"
+                            android:textStyle="bold"
+                            app:layout_constraintBottom_toBottomOf="@+id/step_title_tv"
+                            app:layout_constraintEnd_toEndOf="parent"
+                            app:layout_constraintStart_toEndOf="@+id/barrier_title_end_land"
+                            app:layout_constraintTop_toTopOf="@+id/step_title_tv" />
+
+                        <com.grkj.ui_base.widget.RequiredTextView
+                            android:id="@+id/step_title_short_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginVertical="@dimen/common_spacing_2x"
+                            android:text="@string/workflow_step_title_short"
+                            android:textSize="@dimen/normal_text_size_18"
+                            android:textStyle="bold"
+                            app:layout_constraintEnd_toEndOf="@+id/barrier_title_end_land"
+                            app:layout_constraintStart_toStartOf="parent"
+                            app:layout_constraintTop_toBottomOf="@+id/step_title_tv"
+                            app:markPosition="end"
+                            app:required="true" />
+
+                        <EditText
+                            android:id="@+id/step_title_short_et"
+                            android:layout_width="0dp"
+                            android:layout_height="wrap_content"
+                            android:layout_marginHorizontal="@dimen/common_spacing"
+                            android:background="@drawable/bg_common_input"
+                            android:hint="@string/please_input_step_title_short"
+                            android:maxLines="1"
+                            android:paddingHorizontal="@dimen/common_spacing"
+                            android:paddingVertical="5dp"
+                            android:singleLine="true"
+                            android:textSize="@dimen/normal_text_size_18"
+                            android:textStyle="bold"
+                            app:layout_constraintBottom_toBottomOf="@+id/step_title_short_tv"
+                            app:layout_constraintEnd_toEndOf="parent"
+                            app:layout_constraintStart_toEndOf="@+id/barrier_title_end_land"
+                            app:layout_constraintTop_toTopOf="@+id/step_title_short_tv" />
+
+                        <com.grkj.ui_base.widget.RequiredTextView
+                            android:id="@+id/step_confirm_type_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginVertical="@dimen/common_spacing_2x"
+                            android:text="@string/workflow_step_confirm_type"
+                            android:textSize="@dimen/normal_text_size_18"
+                            android:textStyle="bold"
+                            app:layout_constraintEnd_toEndOf="@+id/barrier_title_end_land"
+                            app:layout_constraintStart_toStartOf="parent"
+                            app:layout_constraintTop_toBottomOf="@+id/step_title_short_tv"
+                            app:markPosition="end"
+                            app:required="true" />
+
+                        <TextView
+                            android:id="@+id/step_confirm_type"
+                            android:layout_width="0dp"
+                            android:layout_height="wrap_content"
+                            android:layout_marginHorizontal="@dimen/common_spacing"
+                            android:background="@drawable/bg_common_input"
+                            android:drawableRight="@mipmap/icon_drop_down"
+                            android:hint="@string/please_select_step_confirm_type"
+                            android:maxLines="1"
+                            android:paddingHorizontal="@dimen/common_spacing"
+                            android:paddingVertical="5dp"
+                            android:singleLine="true"
+                            android:textSize="@dimen/normal_text_size_18"
+                            android:textStyle="bold"
+                            app:layout_constraintBottom_toBottomOf="@+id/step_confirm_type_tv"
+                            app:layout_constraintEnd_toEndOf="parent"
+                            app:layout_constraintStart_toEndOf="@+id/barrier_title_end_land"
+                            app:layout_constraintTop_toTopOf="@+id/step_confirm_type_tv" />
+
+                        <com.grkj.ui_base.widget.RequiredTextView
+                            android:id="@+id/step_confirm_role_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginVertical="@dimen/common_spacing_2x"
+                            android:text="@string/workflow_step_confirm_role"
+                            android:textSize="@dimen/normal_text_size_18"
+                            android:textStyle="bold"
+                            android:visibility="gone"
+                            app:layout_constraintEnd_toEndOf="@+id/barrier_title_end_land"
+                            app:layout_constraintStart_toStartOf="parent"
+                            app:layout_constraintTop_toBottomOf="@+id/step_confirm_type_tv"
+                            app:markPosition="end"
+                            app:required="true" />
+
+                        <TextView
+                            android:id="@+id/step_confirm_role"
+                            android:layout_width="0dp"
+                            android:layout_height="wrap_content"
+                            android:layout_marginHorizontal="@dimen/common_spacing"
+                            android:background="@drawable/bg_common_input"
+                            android:drawableRight="@mipmap/icon_drop_down"
+                            android:hint="@string/please_select_step_confirm_role"
+                            android:maxLines="1"
+                            android:paddingHorizontal="@dimen/common_spacing"
+                            android:paddingVertical="5dp"
+                            android:singleLine="true"
+                            android:textSize="@dimen/normal_text_size_18"
+                            android:textStyle="bold"
+                            android:visibility="gone"
+                            app:layout_constraintBottom_toBottomOf="@+id/step_confirm_role_tv"
+                            app:layout_constraintStart_toEndOf="@+id/barrier_title_end_land"
+                            app:layout_constraintTop_toTopOf="@+id/step_confirm_role_tv" />
+
+                        <com.grkj.ui_base.widget.RequiredTextView
+                            android:id="@+id/step_confirm_member_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginVertical="@dimen/common_spacing_2x"
+                            android:text="@string/workflow_step_confirm_member"
+                            android:textSize="@dimen/normal_text_size_18"
+                            android:textStyle="bold"
+                            android:visibility="gone"
+                            app:layout_constraintEnd_toEndOf="@+id/barrier_title_end_land"
+                            app:layout_constraintStart_toStartOf="parent"
+                            app:layout_constraintTop_toBottomOf="@+id/step_confirm_role_tv"
+                            app:markPosition="end"
+                            app:required="false" />
+
+                        <TextView
+                            android:id="@+id/step_confirm_member"
+                            android:layout_width="0dp"
+                            android:layout_height="wrap_content"
+                            android:layout_marginHorizontal="@dimen/common_spacing"
+                            android:background="@drawable/bg_common_input"
+                            android:drawableRight="@mipmap/icon_drop_down"
+                            android:hint="@string/please_select_step_confirm_member"
+                            android:maxLines="1"
+                            android:paddingHorizontal="@dimen/common_spacing"
+                            android:paddingVertical="5dp"
+                            android:singleLine="true"
+                            android:textSize="@dimen/normal_text_size_18"
+                            android:textStyle="bold"
+                            android:visibility="gone"
+                            app:layout_constraintBottom_toBottomOf="@+id/step_confirm_member_tv"
+                            app:layout_constraintStart_toEndOf="@+id/barrier_title_end_land"
+                            app:layout_constraintTop_toTopOf="@+id/step_confirm_member_tv" />
+
+                        <com.grkj.ui_base.widget.RequiredTextView
+                            android:id="@+id/step_function_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginVertical="@dimen/common_spacing_2x"
+                            android:text="@string/workflow_step_function"
+                            android:textSize="@dimen/normal_text_size_18"
+                            android:textStyle="bold"
+                            app:layout_constraintEnd_toEndOf="@+id/barrier_title_end_land"
+                            app:layout_constraintTop_toBottomOf="@+id/step_confirm_member_tv"
+                            app:markPosition="end"
+                            app:required="true" />
+
+                        <androidx.recyclerview.widget.RecyclerView
+                            android:id="@+id/step_function_rv"
+                            android:layout_width="0dp"
+                            android:layout_height="wrap_content"
+                            android:layout_marginHorizontal="10dp"
+                            app:layout_constraintEnd_toEndOf="parent"
+                            app:layout_constraintStart_toEndOf="@+id/barrier_title_end_land"
+                            app:layout_constraintTop_toTopOf="@+id/step_function_tv" />
+
+
+                    </androidx.constraintlayout.widget.ConstraintLayout>
+                </androidx.core.widget.NestedScrollView>
+
+                <androidx.constraintlayout.widget.ConstraintLayout
                     android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    android:layout_marginHorizontal="@dimen/common_spacing"
-                    android:background="@drawable/bg_common_input"
-                    android:drawableRight="@mipmap/icon_drop_down"
-                    android:hint="@string/please_select_step_confirm_role"
-                    android:maxLines="1"
-                    android:paddingHorizontal="@dimen/common_spacing"
-                    android:paddingVertical="5dp"
-                    android:singleLine="true"
-                    android:textSize="@dimen/normal_text_size_18"
-                    android:textStyle="bold"
-                    android:visibility="gone"
-                    app:layout_constraintBottom_toBottomOf="@+id/step_confirm_role_tv"
-                    app:layout_constraintStart_toEndOf="@+id/barrier_title_end"
-                    app:layout_constraintTop_toTopOf="@+id/step_confirm_role_tv" />
-
-                <com.grkj.ui_base.widget.RequiredTextView
-                    android:id="@+id/step_confirm_member_tv"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_marginVertical="@dimen/common_spacing_2x"
-                    android:text="@string/workflow_step_confirm_member"
-                    android:textSize="@dimen/normal_text_size_18"
-                    android:textStyle="bold"
-                    android:visibility="gone"
-                    app:layout_constraintEnd_toEndOf="@+id/barrier_title_end"
-                    app:layout_constraintTop_toBottomOf="@+id/step_confirm_role_tv"
-                    app:markPosition="end"
-                    app:required="false" />
-
-                <TextView
-                    android:id="@+id/step_confirm_member"
-                    android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    android:layout_marginHorizontal="@dimen/common_spacing"
-                    android:background="@drawable/bg_common_input"
-                    android:drawableRight="@mipmap/icon_drop_down"
-                    android:hint="@string/please_select_step_confirm_member"
-                    android:maxLines="1"
-                    android:paddingHorizontal="@dimen/common_spacing"
-                    android:paddingVertical="5dp"
-                    android:singleLine="true"
-                    android:textSize="@dimen/normal_text_size_18"
-                    android:textStyle="bold"
-                    android:visibility="gone"
-                    app:layout_constraintBottom_toBottomOf="@+id/step_confirm_member_tv"
-                    app:layout_constraintStart_toEndOf="@+id/barrier_title_end"
-                    app:layout_constraintTop_toTopOf="@+id/step_confirm_member_tv" />
-
-                <com.grkj.ui_base.widget.RequiredTextView
-                    android:id="@+id/step_function_tv"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_marginVertical="@dimen/common_spacing_2x"
-                    android:text="@string/workflow_step_function"
-                    android:textSize="@dimen/normal_text_size_18"
-                    android:textStyle="bold"
-                    app:layout_constraintEnd_toEndOf="@+id/barrier_title_end"
-                    app:layout_constraintTop_toBottomOf="@+id/step_confirm_member_tv"
-                    app:markPosition="end"
-                    app:required="true" />
-
-                <androidx.recyclerview.widget.RecyclerView
-                    android:id="@+id/step_function_rv"
-                    android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    android:layout_marginHorizontal="10dp"
-                    app:layout_constraintBottom_toBottomOf="@+id/step_function_tv"
-                    app:layout_constraintStart_toEndOf="@+id/barrier_title_end"
-                    app:layout_constraintTop_toTopOf="@+id/step_function_tv" />
-
-                <com.grkj.ui_base.widget.RequiredTextView
-                    android:id="@+id/step_description_tv"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_marginVertical="@dimen/common_spacing_2x"
-                    android:text="@string/workflow_step_description"
-                    android:textSize="@dimen/normal_text_size_18"
-                    android:textStyle="bold"
-                    app:layout_constraintEnd_toEndOf="@+id/barrier_title_end"
-                    app:layout_constraintTop_toBottomOf="@+id/step_function_tv"
-                    app:markPosition="end"
-                    app:required="true" />
-
-                <EditText
-                    android:id="@+id/step_description_et"
-                    android:layout_width="0dp"
-                    android:layout_height="280dp"
-                    android:layout_marginHorizontal="@dimen/common_spacing"
-                    android:background="@drawable/bg_common_input"
-                    android:gravity="top"
-                    android:hint="@string/please_input_step_description"
-                    android:paddingHorizontal="@dimen/common_spacing"
-                    android:paddingVertical="5dp"
-                    android:scrollbars="vertical"
-                    android:textSize="@dimen/normal_text_size_18"
-                    android:textStyle="bold"
-                    app:layout_constraintBottom_toBottomOf="@+id/step_description_tv"
-                    app:layout_constraintEnd_toEndOf="parent"
-                    app:layout_constraintStart_toEndOf="@+id/barrier_title_end"
-                    app:layout_constraintTop_toTopOf="@+id/step_description_tv" />
-
-            </androidx.constraintlayout.widget.ConstraintLayout>
-
+                    android:layout_height="match_parent"
+                    android:layout_weight="1">
+
+                    <com.grkj.ui_base.widget.RequiredTextView
+                        android:id="@+id/step_description_tv"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginVertical="@dimen/common_spacing_2x"
+                        android:text="@string/workflow_step_description"
+                        android:textSize="@dimen/normal_text_size_18"
+                        android:textStyle="bold"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent"
+                        app:markPosition="end"
+                        app:required="true" />
+
+                    <EditText
+                        android:id="@+id/step_description_et"
+                        android:layout_width="0dp"
+                        android:layout_height="280dp"
+                        android:layout_marginHorizontal="@dimen/common_spacing"
+                        android:background="@drawable/bg_common_input"
+                        android:gravity="top"
+                        android:hint="@string/please_input_step_description"
+                        android:paddingHorizontal="@dimen/common_spacing"
+                        android:paddingVertical="5dp"
+                        android:scrollbars="vertical"
+                        android:textSize="@dimen/normal_text_size_18"
+                        android:textStyle="bold"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintStart_toEndOf="@+id/step_description_tv"
+                        app:layout_constraintTop_toTopOf="@+id/step_description_tv" />
+
+                </androidx.constraintlayout.widget.ConstraintLayout>
+            </LinearLayout>
         </LinearLayout>
 
         <LinearLayout

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

@@ -3,7 +3,8 @@
 
     <LinearLayout
         android:layout_width="160dp"
-        android:layout_height="160dp"
+        android:layout_height="@dimen/home_menu_item_layout_size"
+        android:padding="10dp"
         android:gravity="center_horizontal"
         android:orientation="vertical">
 
@@ -26,6 +27,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>

+ 26 - 0
app/src/main/res/layout-land/item_job_execute_colock.xml

@@ -0,0 +1,26 @@
+<?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="wrap_content"
+        android:gravity="center"
+        android:orientation="vertical"
+        android:padding="@dimen/common_spacing_small">
+
+        <ImageView
+            android:layout_width="@dimen/job_execute_colock_size"
+            android:layout_height="@dimen/job_execute_colock_size"
+            android:src="@mipmap/icon_selected_member" />
+
+        <TextView
+            android:id="@+id/name"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:textColor="@color/black"
+            android:textSize="12sp"
+            tools:text="王俊杰" />
+    </LinearLayout>
+</layout>

+ 42 - 10
app/src/main/res/layout/fragment_job_execute.xml

@@ -113,14 +113,15 @@
                             android:layout_toLeftOf="@+id/lock_iv"
                             android:gravity="center"
                             android:text="@string/job_execute_tab_title_lock"
+                            android:textColor="@color/black"
                             android:textSize="@dimen/common_text_size" />
 
                         <ImageView
                             android:id="@+id/lock_iv"
-                            android:layout_width="wrap_content"
-                            android:layout_height="wrap_content"
+                            android:layout_width="@dimen/job_execute_tab_icon_size"
+                            android:layout_height="30dp"
                             android:layout_centerInParent="true"
-                            android:paddingHorizontal="@dimen/common_spacing"
+                            android:layout_marginHorizontal="5dp"
                             android:src="@mipmap/icon_job_execute_lock" />
 
                         <TextView
@@ -129,6 +130,7 @@
                             android:layout_height="wrap_content"
                             android:layout_centerVertical="true"
                             android:layout_toRightOf="@+id/lock_iv"
+                            android:textColor="@color/black"
                             android:textSize="@dimen/common_text_size" />
                     </RelativeLayout>
 
@@ -148,14 +150,15 @@
                             android:layout_toLeftOf="@+id/colock_iv"
                             android:gravity="center"
                             android:text="@string/job_execute_tab_title_colock"
+                            android:textColor="@color/black"
                             android:textSize="@dimen/common_text_size" />
 
                         <ImageView
                             android:id="@+id/colock_iv"
-                            android:layout_width="wrap_content"
-                            android:layout_height="wrap_content"
+                            android:layout_width="30dp"
+                            android:layout_height="30dp"
                             android:layout_centerInParent="true"
-                            android:paddingHorizontal="@dimen/common_spacing"
+                            android:layout_marginHorizontal="5dp"
                             android:src="@mipmap/icon_job_execute_colock" />
 
                         <TextView
@@ -164,10 +167,23 @@
                             android:layout_height="wrap_content"
                             android:layout_centerVertical="true"
                             android:layout_toRightOf="@+id/colock_iv"
+                            android:textColor="@color/black"
                             android:textSize="@dimen/common_text_size" />
                     </RelativeLayout>
                 </LinearLayout>
 
+                <TextView
+                    android:id="@+id/step_tip_tv"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="@dimen/common_spacing_2x"
+                    android:layout_marginTop="@dimen/common_spacing"
+                    android:drawableLeft="@mipmap/tip"
+                    android:gravity="center_vertical"
+                    android:textColor="@color/black"
+                    android:textSize="@dimen/common_text_size"
+                    android:visibility="gone" />
+
                 <LinearLayout
                     android:id="@+id/data_layout"
                     android:layout_width="match_parent"
@@ -182,8 +198,10 @@
 
                     <RelativeLayout
                         android:layout_width="match_parent"
-                        android:layout_height="50dp"
-                        android:background="@drawable/common_layout_bg">
+                        android:layout_height="wrap_content"
+                        android:background="@drawable/common_layout_bg"
+                        android:elevation="@dimen/elevation_3"
+                        android:paddingVertical="@dimen/common_spacing">
 
                         <TextView
                             android:id="@+id/data_title_tv"
@@ -216,7 +234,7 @@
 
                             <LinearLayout
                                 android:layout_width="match_parent"
-                                android:layout_height="@dimen/point_header_height"
+                                android:layout_height="wrap_content"
                                 android:background="@drawable/common_layout_bg"
                                 android:divider="@drawable/divider_table"
                                 android:showDividers="middle">
@@ -226,6 +244,7 @@
                                     android:layout_height="match_parent"
                                     android:layout_weight="1"
                                     android:gravity="center"
+                                    android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/point_name_tv"
                                     android:textSize="@dimen/common_text_size" />
 
@@ -234,6 +253,7 @@
                                     android:layout_height="match_parent"
                                     android:layout_weight="1"
                                     android:gravity="center"
+                                    android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/point_manage_point_function"
                                     android:textSize="@dimen/common_text_size" />
 
@@ -242,6 +262,7 @@
                                     android:layout_height="match_parent"
                                     android:layout_weight="1"
                                     android:gravity="center"
+                                    android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/lock_status"
                                     android:textSize="@dimen/common_text_size" />
                             </LinearLayout>
@@ -264,7 +285,7 @@
 
                             <LinearLayout
                                 android:layout_width="match_parent"
-                                android:layout_height="@dimen/colocker_layout_height"
+                                android:layout_height="wrap_content"
                                 android:background="@drawable/common_layout_bg"
                                 android:divider="@drawable/divider_table"
                                 android:showDividers="middle">
@@ -275,6 +296,7 @@
                                     android:layout_height="match_parent"
                                     android:layout_weight="1"
                                     android:gravity="center"
+                                    android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/wait_to_colock"
                                     android:textSize="@dimen/common_text_size" />
 
@@ -284,6 +306,7 @@
                                     android:layout_height="match_parent"
                                     android:layout_weight="1"
                                     android:gravity="center"
+                                    android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/already_colock"
                                     android:textSize="@dimen/common_text_size" />
 
@@ -293,6 +316,7 @@
                                     android:layout_height="match_parent"
                                     android:layout_weight="1"
                                     android:gravity="center"
+                                    android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/already_uncolock"
                                     android:textSize="@dimen/common_text_size" />
                             </LinearLayout>
@@ -335,8 +359,16 @@
                             android:padding="@dimen/common_spacing"
                             android:textSize="@dimen/common_text_size" />
                     </FrameLayout>
+
+                    <View
+                        android:id="@+id/space_view"
+                        android:layout_width="1dp"
+                        android:layout_height="0dp"
+                        android:layout_weight="1"
+                        android:visibility="gone" />
                 </LinearLayout>
 
+
                 <LinearLayout
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"

+ 3 - 5
app/src/main/res/layout/item_job_execute_colock.xml

@@ -5,16 +5,14 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:background="@drawable/bg_btn_job_execute_normal"
         android:gravity="center"
         android:orientation="vertical"
         android:padding="@dimen/common_spacing_small">
 
         <ImageView
-            android:layout_width="@dimen/common_spacing_2x"
-            android:layout_height="@dimen/common_spacing_2x"
-            android:src="@drawable/icon_select_member"
-            android:tint="@color/black" />
+            android:layout_width="@dimen/job_execute_colock_size"
+            android:layout_height="@dimen/job_execute_colock_size"
+            android:src="@mipmap/icon_selected_member" />
 
         <TextView
             android:id="@+id/name"

BIN
app/src/main/res/mipmap-hdpi/tip.png


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

@@ -375,5 +375,10 @@
     <string name="job_execute_step_description">Operation Description(%1$s)</string>
     <string name="job_execute_lock_status_title">Point Lock Status</string>
     <string name="job_execute_colocker_colock_status_title">CoLocker CoLock status</string>
+    <string name="has_lock_not_locked">Your point %s are not locked</string>
+    <string name="please_complete_colock">Please let coLock complete</string>
+    <string name="please_complete_release_colock">Please release coLock</string>
+    <string name="has_lock_not_unlocked">Your point %s are not unlocked</string>
+    <string name="please_do_colock">Please have co-locker perform co-lock</string>
 
 </resources>

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

@@ -63,21 +63,22 @@
     <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_18">18sp</dimen>
+    <dimen name="normal_text_size_18">30sp</dimen>
     <dimen name="login_dialog_width">844dp</dimen>
     <dimen name="login_dialog_height">744dp</dimen>
     <dimen name="login_dialog_text_size">42sp</dimen>
     <dimen name="login_dialog_input_height">115dp</dimen>
     <dimen name="login_dialog_btn_height">102dp</dimen>
     <dimen name="step_rv_height">323dp</dimen>
-    <dimen name="point_header_height">85dp</dimen>
     <dimen name="point_rv_height">408dp</dimen>
-    <dimen name="colocker_layout_height">85dp</dimen>
     <dimen name="btn_layout_min_height">112dp</dimen>
     <dimen name="step_item_width">204dp</dimen>
     <dimen name="step_item_height">306dp</dimen>
     <dimen name="step_item_icon_size">119dp</dimen>
     <dimen name="step_item_index_size">51dp</dimen>
+    <dimen name="workflow_step_item_width">204dp</dimen>
+    <dimen name="workflow_step_item_height">170dp</dimen>
+    <dimen name="workflow_step_item_index_size">51dp</dimen>
     <dimen name="home_bottom_nav_ball_size">8dp</dimen>
     <dimen name="home_bottom_nav_corner_radius">10dp</dimen>
     <dimen name="home_bottom_nav_notch_height">28dp</dimen>
@@ -92,4 +93,6 @@
     <dimen name="job_execute_info_size">40dp</dimen>
     <dimen name="icon_member_size">30dp</dimen>
     <dimen name="icon_add_point_or_member_size">60dp</dimen>
+    <dimen name="job_execute_colock_size">59dp</dimen>
+    <dimen name="job_execute_tab_icon_size">51dp</dimen>
 </resources>

+ 0 - 3
app/src/main/res/values-night/dimens.xml

@@ -1,3 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-</resources>

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

@@ -375,5 +375,10 @@
     <string name="job_execute_step_description">操作说明(%1$s)</string>
     <string name="job_execute_lock_status_title">隔离点锁定状态</string>
     <string name="job_execute_colocker_colock_status_title">共锁人员共锁状态</string>
+    <string name="has_lock_not_locked">您还有%s点位未上锁</string>
+    <string name="please_complete_colock">请完成共锁</string>
+    <string name="please_complete_release_colock">请先完成共锁解除</string>
+    <string name="has_lock_not_unlocked">您还有%s点位未解锁</string>
+    <string name="please_do_colock">请共锁人能完成共锁</string>
 
 </resources>

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

@@ -70,9 +70,7 @@
     <dimen name="login_dialog_input_height">68dp</dimen>
     <dimen name="login_dialog_btn_height">60dp</dimen>
     <dimen name="step_rv_height">190dp</dimen>
-    <dimen name="point_header_height">50dp</dimen>
     <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>
@@ -95,4 +93,6 @@
     <dimen name="job_execute_info_size">40dp</dimen>
     <dimen name="icon_member_size">30dp</dimen>
     <dimen name="icon_add_point_or_member_size">60dp</dimen>
+    <dimen name="job_execute_colock_size">35dp</dimen>
+    <dimen name="job_execute_tab_icon_size">30dp</dimen>
 </resources>

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

@@ -122,7 +122,7 @@
     <string name="job_workstation">作业区域</string>
     <string name="create_job_name">作业名称</string>
     <string name="please_select_job_workstation">请选择作业区域</string>
-    <string name="job_create_and_execute_succeed">作业执行成功</string>
+    <string name="job_create_and_execute_succeed">作业开始执行</string>
     <string name="job_create_and_execute_failed">作业执行失败</string>
     <string name="job_save_and_execute_tip">确定要执行作业\"%1$s\"吗?</string>
     <string name="save_sop_check">生成SOP</string>
@@ -378,5 +378,10 @@
     <string name="job_execute_step_description">操作说明(%1$s)</string>
     <string name="job_execute_lock_status_title">隔离点锁定状态</string>
     <string name="job_execute_colocker_colock_status_title">共锁人员共锁状态</string>
+    <string name="has_lock_not_locked">您还有%s点位未上锁</string>
+    <string name="please_complete_colock">请完成共锁</string>
+    <string name="please_complete_release_colock">请先完成共锁解除</string>
+    <string name="has_lock_not_unlocked">您还有%s点位未解锁</string>
+    <string name="please_do_colock">请共锁人能完成共锁</string>
 
 </resources>

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

@@ -4,6 +4,7 @@ import androidx.room.ColumnInfo
 import androidx.room.Entity
 import androidx.room.Ignore
 import androidx.room.PrimaryKey
+import com.grkj.data.data.MainDomainData
 import com.grkj.data.enums.JobTicketStatusEnum
 
 /**
@@ -153,4 +154,27 @@ data class WorkflowStep(
     fun hasAnyHardwareOperationFunction(): Boolean {
         return enableLock || enableColock || enableReleaseColock || enableUnlock
     }
+
+    /**
+     * 当前用户是否可以确认
+     */
+    @Ignore
+    fun currentUserCanConfirm(): Boolean {
+        if (confirmRoleCode == null && confirmUser == null) {
+            return true
+        }
+        if (confirmRoleCode != null && confirmUser == null && MainDomainData.roleKeys?.contains(
+                confirmRoleCode!!
+            ) == true
+        ) {
+            return true
+        }
+        if (confirmRoleCode != null && confirmUser != null && MainDomainData.roleKeys?.contains(
+                confirmRoleCode!!
+            ) == true && MainDomainData.userInfo?.userId == confirmUser
+        ) {
+            return true
+        }
+        return false
+    }
 }

+ 5 - 3
data/src/main/java/com/grkj/data/model/local/WorkTicketGet.kt

@@ -108,14 +108,16 @@ class WorkTicketGet {
         for (item in data) {
             // 1. 调用回调接口获取远程的 ticketStatus,并根据情况设置两个标志
             val (localTicketFinish, remoteTicketFinished) = suspendCoroutine<Pair<Boolean, Boolean>> { cont ->
-                RepositoryManager.jobTicketRepo.getTicketDetail(item.taskCode?.toLong() ?: 0) { res ->
+                RepositoryManager.jobTicketRepo.getTicketDetail(
+                    item.taskCode?.toLong() ?: 0
+                ) { res ->
                     logger.info("作业票状态: ${res?.ticketStatus}")
-                    if (res?.ticketStatus in listOf(
+                    if (res == null || res.ticketStatus in listOf(
                             "5",
                             "6"
                         )
                     ) {
-                        // 只要远程状态是 5 或 6,就认为 remoteTicketFinished = true
+                        // 只要远程状态是 5 或 6或者数据都没有,就认为 remoteTicketFinished = true
                         cont.resume(true to true)
                     } else {
                         // 否则,用本地 dataList 的所有 closed 字段判断 localTicketFinish,本地没完成就返回 false

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

@@ -188,6 +188,9 @@ interface IJobTicketRepository {
         callback: (Boolean, String, Int) -> Unit
     )
 
+    /**
+     * 更新钥匙取出
+     */
     fun updateKeyTake(ticketId: Long, keyNfc: String, serialNo: String, callback: (Boolean) -> Unit)
 
     /**

+ 3 - 1
data/src/main/java/com/grkj/data/repository/impl/JobTicketRepository.kt

@@ -475,7 +475,9 @@ class JobTicketRepository @Inject constructor(
         isJobTicketKey.ticketId = ticketId
         isJobTicketKey.keyId = keyData.keyId
         val workflowSteps = workflowStepDao.getStepsByMode(jobTicketData.modeId!!)
-        val currentStep = workflowSteps.find { it.stepIndex == jobTicketData.ticketStatus.toInt() }
+        val ticketSteps = jobTicketDao.getJobTicketStepDataByTicketId(ticketId)
+        val currentStep =
+            workflowSteps.find { it.stepId == ticketSteps.firstOrNull { it.stepStatus == "0" }?.workflowStepId }
         if (currentStep?.enableLock == true) {
             isJobTicketKey.ticketType = 0
         } else if (currentStep?.enableUnlock == true) {

+ 34 - 28
ui-base/src/main/java/com/grkj/ui_base/business/BleBusinessManager.kt

@@ -375,16 +375,14 @@ object BleBusinessManager {
                                     RepositoryManager.workflowRepository.getStepsByMode(
                                         jobTicketData.modeId
                                     )
-                                var step = jobTicketData.ticketStatus
+                                var step = it?.firstOrNull { it.stepStatus == "0" }?.stepIndex
                                 val currentStep =
                                     workflowSteps.find { it.stepIndex == step?.toInt() }
                                 logger.info("当前步骤:${currentStep}")
                                 RepositoryManager.jobTicketRepo.getTicketDetail(itBO.ticketId) { ticketDetail ->
                                     logger.info("步骤详情:${ticketDetail}")
                                     val role = ticketDetail?.ticketUserVOList?.find {
-                                        it.userId == MainDomainData.userInfo?.userId && MainDomainData.roleKeys?.contains(
-                                            RoleEnum.JTLOCKER.roleKey
-                                        ) == true
+                                        it.userId == MainDomainData.userInfo?.userId && currentStep?.currentUserCanConfirm() == true
                                     }
                                     if (role == null) {
                                         ThreadUtils.runOnMain {
@@ -625,31 +623,39 @@ object BleBusinessManager {
                                 }
                                 val ticketStepDataVo =
                                     RepositoryManager.jobTicketRepo.getJobTicketStepDataByTicketId(
-                                        data.taskCode?.toLong()!!
+                                        jobTicketData.ticketId
                                     ).firstOrNull { it.stepStatus == "0" }
-                                ticketStepDataVo?.stepStatus = "1"
-                                val isTicketStepData = BeanUtils.copyProperties(
-                                    ticketStepDataVo, IsJobTicketStep::class.java
-                                )
-                                isTicketStepData?.let {
-                                    logger.info("更新步骤:${it}")
-                                    RepositoryManager.jobTicketRepo.updateTicketStepData(it)
-                                }
                                 val workflowSteps =
                                     RepositoryManager.workflowRepository.getStepsByMode(
                                         jobTicketData.modeId!!
                                     )
-                                val ticketStep =
-                                    RepositoryManager.jobTicketRepo.getJobTicketStepDataByTicketId(
-                                        jobTicketData.ticketId
+                                var currentWorkflowStep =
+                                    workflowSteps.find { it.stepId == ticketStepDataVo?.workflowStepId }
+                                if ((currentWorkflowStep?.enableLock == true && currentWorkflowStep.enableColock == true) ||
+                                    (currentWorkflowStep?.enableReleaseColock == true && currentWorkflowStep.enableUnlock == true)
+                                ) {
+                                    logger.info("当前上锁和共锁或者解锁和解除共锁在同一步骤,不更新步骤状态")
+                                } else {
+                                    ticketStepDataVo?.stepStatus = "1"
+                                    val isTicketStepData = BeanUtils.copyProperties(
+                                        ticketStepDataVo, IsJobTicketStep::class.java
+                                    )
+                                    isTicketStepData?.let {
+                                        logger.info("更新步骤:${it}")
+                                        RepositoryManager.jobTicketRepo.updateTicketStepData(it)
+                                    }
+                                    val ticketStep =
+                                        RepositoryManager.jobTicketRepo.getJobTicketStepDataByTicketId(
+                                            jobTicketData.ticketId
+                                        )
+                                    currentWorkflowStep = workflowSteps.find {
+                                        it.stepId == ticketStep.firstOrNull { it.stepStatus == "0" }?.workflowStepId
+                                    }
+                                    RepositoryManager.jobTicketRepo.updateTicketDataStatus(
+                                        data.taskCode?.toLong()!!,
+                                        currentWorkflowStep?.getTicketStatus()?.toInt() ?: 0
                                     )
-                                val currentWorkflowStep = workflowSteps.find {
-                                    it.stepId == ticketStep.firstOrNull { it.stepStatus == "0" }?.workflowStepId
                                 }
-                                RepositoryManager.jobTicketRepo.updateTicketDataStatus(
-                                    data.taskCode?.toLong()!!,
-                                    currentWorkflowStep?.getTicketStatus()?.toInt() ?: 0
-                                )
                                 data.taskCode?.toLong()?.let {
                                     logger.info("刷新界面:${it}")
                                     UpdateTicketProgressEvent.sendUpdateTicketProgressEvent(it)
@@ -715,21 +721,21 @@ object BleBusinessManager {
             }
             val workflowSteps =
                 RepositoryManager.workflowRepository.getStepsByMode(jobTicketData.modeId)
-            var step = workflowSteps.find { it.stepIndex == jobTicketData.ticketStatus?.toInt() }
+            var step = it?.firstOrNull { it.stepStatus == "0" }?.stepIndex
+            val currentStep =
+                workflowSteps.find { it.stepIndex == step?.toInt() }
             RepositoryManager.jobTicketRepo.getTicketDetail(ticketId) { ticketDetail ->
                 if (ticketDetail == null) {
                     return@getTicketDetail
                 }
                 val role = ticketDetail.ticketUserVOList?.find {
-                    it.userId == MainDomainData.userInfo?.userId && MainDomainData.roleKeys?.contains(
-                        RoleEnum.JTLOCKER.roleKey
-                    ) == true
+                    it.userId == MainDomainData.userInfo?.userId && currentStep?.currentUserCanConfirm() == true
                 }
                 if (role == null) {
                     PopTip.tip(R.string.you_are_not_locker_tip)
                     return@getTicketDetail
                 }
-                if (step?.enableLock == true) {    // 上锁工作票
+                if (currentStep?.enableLock == true) {    // 上锁工作票
                     sendTicketBusiness(
                         true,
                         mac,
@@ -738,7 +744,7 @@ object BleBusinessManager {
                             ?.map { it.lockNfc }?.toMutableList(),
                         true
                     )
-                } else if (step?.enableUnlock == true) { // 解锁工作票
+                } else if (currentStep?.enableUnlock == true) { // 解锁工作票
                     sendTicketBusiness(
                         false, mac, ticketDetail, null, true
                     )

+ 1 - 0
ui-base/src/main/java/com/grkj/ui_base/business/ModbusBusinessManager.kt

@@ -128,6 +128,7 @@ object ModbusBusinessManager {
                             if (isSuccess) {
                                 UpdateTicketProgressEvent.sendUpdateTicketProgressEvent(info.ticketId)
                                 //钥匙取出之后重新再连一把钥匙待机
+                                removeDeviceTake(DeviceConst.DEVICE_TYPE_KEY, info.nfc)
                                 ModBusController.getKeyByRfid(
                                     info.nfc
                                 )?.mac?.let {

+ 2 - 1
ui-base/src/main/res/values-en/strings.xml

@@ -269,7 +269,7 @@
     <string name="allocating_worker_tip">Please assign locker and co-locker</string>
     <string name="please_go_locking">Please have locker perform locking operation</string>
     <string name="please_return_key_after_locking">Please have locker return the key after locking</string>
-    <string name="please_do_colock">Please have co-locker perform co-lock and remove co-lock after work</string>
+    <string name="please_do_colock_and_uncolock">Please have co-locker perform co-lock and remove co-lock after work</string>
     <string name="please_go_unlocking">Please have locker perform unlocking operation</string>
     <string name="please_return_key_after_unlocking">Please have locker return the key after unlocking</string>
     <string name="face_active_fail">Face recognition activation failed</string>
@@ -367,4 +367,5 @@
     <string name="not_save_tip">Data not save,Do you want to lost save and leave?</string>
     <string name="please_reopen_ble">Please reopen ble</string>
     <string name="scan_complete_app_restarting">scan complete app restarting</string>
+    <string name="please_do_uncolock">Please have co-locker remove co-lock</string>
 </resources>

+ 1 - 1
ui-base/src/main/res/values-land/dimens.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
-    <dimen name="common_text_size">18sp</dimen>
+    <dimen name="common_text_size">30sp</dimen>
     <dimen name="common_btn_text_size">34sp</dimen>
     <dimen name="common_text_size_land">15.3dp</dimen>
     <dimen name="common_text_size_big">47.6dp</dimen>

+ 2 - 1
ui-base/src/main/res/values-zh/strings.xml

@@ -269,7 +269,7 @@
     <string name="allocating_worker_tip">请设置上锁人和共锁人</string>
     <string name="please_go_locking">请上锁员执行去上锁操作</string>
     <string name="please_return_key_after_locking">请上锁员完成上锁后,归还钥匙</string>
-    <string name="please_do_colock">请共锁人进行共锁,并在工作完成后解除共锁</string>
+    <string name="please_do_colock_and_uncolock">请共锁人进行共锁,并在工作完成后解除共锁</string>
     <string name="please_go_unlocking">请上锁员执行去解锁操作</string>
     <string name="please_return_key_after_unlocking">请上锁员完成解锁后,归还钥匙</string>
     <string name="face_active_fail">人脸识别激活失败</string>
@@ -367,4 +367,5 @@
     <string name="not_save_tip">数据还没有保存,您确定要放弃保存,离开当前页面吗?</string>
     <string name="please_reopen_ble">请重新打开蓝牙</string>
     <string name="scan_complete_app_restarting">扫描完成,APP将自动重启</string>
+    <string name="please_do_uncolock">请共锁人解除共锁</string>
 </resources>

+ 37 - 0
ui-base/src/main/res/values/dimens.xml

@@ -22,6 +22,43 @@
     <dimen name="common_status_circle_small">5dp</dimen>
     <dimen name="common_status_circle_medium">10dp</dimen>
 
+
+    <!--
+        0dp:无阴影
+        适用场景:平面背景、基础容器,无分层需求的场景
+    -->
+    <dimen name="elevation_0">0dp</dimen>
+
+    <!--
+        2dp:最轻微的阴影
+        适用场景:底部导航栏、分隔线、浮层抓手(BottomSheet 拖拽手柄)
+    -->
+    <dimen name="elevation_1">2dp</dimen>
+
+    <!--
+        7dp:轻度分层
+        适用场景:卡片 (CardView)、列表项悬浮状态、FAB 背景
+    -->
+    <dimen name="elevation_2">7dp</dimen>
+
+    <!--
+        14dp:中度分层
+        适用场景:对话框 (Dialog)、底部抽屉 (BottomSheet)、悬浮菜单
+    -->
+    <dimen name="elevation_3">14dp</dimen>
+
+    <!--
+        24dp:较重分层
+        适用场景:顶部 AppBar/Toolbar、页面 Header、分层容器
+    -->
+    <dimen name="elevation_4">24dp</dimen>
+
+    <!--
+        32dp:最高分层
+        适用场景:全屏模态、重要提示浮层(Modal)、引导遮罩
+    -->
+    <dimen name="elevation_5">32dp</dimen>
+
     <dimen name="common_btn_width">150dp</dimen>
     <dimen name="common_btn_height">50dp</dimen>
     <dimen name="common_btn_width_land">75dp</dimen>

+ 2 - 1
ui-base/src/main/res/values/strings.xml

@@ -269,7 +269,7 @@
     <string name="allocating_worker_tip">请设置上锁人和共锁人</string>
     <string name="please_go_locking">请上锁员执行去上锁操作</string>
     <string name="please_return_key_after_locking">请上锁员完成上锁后,归还钥匙</string>
-    <string name="please_do_colock">请共锁人进行共锁,并在工作完成后解除共锁</string>
+    <string name="please_do_colock_and_uncolock">请共锁人进行共锁,并在工作完成后解除共锁</string>
     <string name="please_go_unlocking">请上锁员执行去解锁操作</string>
     <string name="please_return_key_after_unlocking">请上锁员完成解锁后,归还钥匙</string>
     <string name="face_active_fail">人脸识别激活失败</string>
@@ -367,4 +367,5 @@
     <string name="not_save_tip">数据还没有保存,您确定要放弃保存,离开当前页面吗?</string>
     <string name="please_reopen_ble">请重新打开蓝牙</string>
     <string name="scan_complete_app_restarting">扫描完成,APP将自动重启</string>
+    <string name="please_do_uncolock">请共锁人解除共锁</string>
 </resources>