浏览代码

refactor(更新)
- 作业流程的全屏界面完成

周文健 4 月之前
父节点
当前提交
6b8cf65db3
共有 29 个文件被更改,包括 272 次插入104 次删除
  1. 0 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateJobFragment.kt
  2. 0 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateSopFragment.kt
  3. 0 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateSopJobFragment.kt
  4. 0 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditJobFragment.kt
  5. 0 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditSopFragment.kt
  6. 0 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditSopJobFragment.kt
  7. 36 8
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobExecuteFragment.kt
  8. 1 4
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobManageHomeFragment.kt
  9. 44 6
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobExecuteViewModel.kt
  10. 1 5
      app/src/main/res/drawable/bg_common_input_disable.xml
  11. 5 0
      app/src/main/res/drawable/bg_common_select.xml
  12. 4 0
      app/src/main/res/drawable/bg_common_select_normal.xml
  13. 4 0
      app/src/main/res/drawable/bg_common_select_selected.xml
  14. 23 9
      app/src/main/res/layout-land/fragment_job_execute.xml
  15. 1 1
      app/src/main/res/layout-land/item_job_execute_point.xml
  16. 28 14
      app/src/main/res/layout/fragment_job_execute.xml
  17. 1 1
      app/src/main/res/layout/item_job_execute_point.xml
  18. 3 0
      app/src/main/res/values-en/strings.xml
  19. 3 0
      app/src/main/res/values-zh/strings.xml
  20. 3 0
      app/src/main/res/values/strings.xml
  21. 1 1
      data/src/main/java/com/grkj/data/dao/JobTicketDao.kt
  22. 25 1
      data/src/main/java/com/grkj/data/model/dos/WorkflowStep.kt
  23. 1 0
      data/src/main/java/com/grkj/data/repository/impl/JobTicketRepository.kt
  24. 15 4
      ui-base/src/main/java/com/grkj/ui_base/business/BleBusinessManager.kt
  25. 2 2
      ui-base/src/main/java/com/grkj/ui_base/utils/CommonUtils.kt
  26. 62 42
      ui-base/src/main/java/com/grkj/ui_base/utils/extension/View.kt
  27. 1 0
      ui-base/src/main/res/drawable/common_layout_bg.xml
  28. 2 0
      ui-base/src/main/res/values/colors.xml
  29. 6 0
      ui-base/src/main/res/values/ids.xml

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

@@ -466,7 +466,6 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
         val itemBinding = holder.getBinding<ItemSelectPointBinding>()
         val item = holder.getModel<PointManageVo>()
         itemBinding.pointName.text = item.pointName.toString()
-        itemBinding.pointIcon.setImageResource(R.mipmap.icon_data_manage_menu_point_manage)
     }
 
     override fun onResume() {

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

@@ -369,7 +369,6 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
         val itemBinding = holder.getBinding<ItemSelectPointBinding>()
         val item = holder.getModel<PointManageVo>()
         itemBinding.pointName.text = item.pointName.toString()
-        itemBinding.pointIcon.setImageResource(R.mipmap.icon_data_manage_menu_point_manage)
     }
 
     override fun onResume() {

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

@@ -319,7 +319,6 @@ class CreateSopJobFragment : BaseFormFragment<FragmentCreateSopJobBinding>() {
         val itemBinding = holder.getBinding<ItemSelectPointBinding>()
         val item = holder.getModel<PointManageVo>()
         itemBinding.pointName.text = item.pointName.toString()
-        itemBinding.pointIcon.setImageResource(R.mipmap.icon_data_manage_menu_point_manage)
     }
 
     override fun onResume() {

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

@@ -324,7 +324,6 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
         val itemBinding = holder.getBinding<ItemSelectPointBinding>()
         val item = holder.getModel<PointManageVo>()
         itemBinding.pointName.text = item.pointName.toString()
-        itemBinding.pointIcon.setImageResource(R.mipmap.icon_data_manage_menu_point_manage)
     }
 
     override fun initData() {

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

@@ -290,7 +290,6 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
         val itemBinding = holder.getBinding<ItemSelectPointBinding>()
         val item = holder.getModel<PointManageVo>()
         itemBinding.pointName.text = item.pointName.toString()
-        itemBinding.pointIcon.setImageResource(R.mipmap.icon_data_manage_menu_point_manage)
     }
 
     override fun initData() {

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

@@ -311,7 +311,6 @@ class EditSopJobFragment : BaseFormFragment<FragmentEditSopJobBinding>() {
         val itemBinding = holder.getBinding<ItemSelectPointBinding>()
         val item = holder.getModel<PointManageVo>()
         itemBinding.pointName.text = item.pointName.toString()
-        itemBinding.pointIcon.setImageResource(R.mipmap.icon_data_manage_menu_point_manage)
     }
 
     override fun initData() {

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

@@ -107,28 +107,51 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         }
         binding.fullScreen.setDebouncedClickListener {
             if ((binding.dataLayout.parent as ViewGroup).id == binding.fullScreenRootLayout.id) {
-                toggleExpandView(binding.fullScreenRootLayout, binding.dataLayout, false)
-            } else {
                 toggleExpandView(binding.fullScreenRootLayout, binding.dataLayout, true)
+            } else {
+                toggleExpandView(binding.fullScreenRootLayout, binding.dataLayout, false)
             }
         }
+        binding.descriptionTab.setDebouncedClickListener {
+            checkLayout(0)
+        }
+        binding.lockerTab.setDebouncedClickListener {
+            checkLayout(1)
+        }
+        binding.colockerTab.setDebouncedClickListener {
+            checkLayout(2)
+        }
     }
 
     /**
      * 检查界面
      */
     private fun checkLayout(index: Int) {
-        binding.stepDescriptionTv?.isVisible = index == 0
-        binding.lockStatusLayout?.isVisible = index == 1
+        binding.descriptionTab.isSelected = index == 0
+        binding.lockerTab.isSelected = index == 1
+        binding.colockerTab.isSelected = index == 2
+        binding.stepDescriptionTv.isVisible = index == 0
+        binding.lockStatusLayout.isVisible = index == 1
         binding.colockerLayout.isVisible = index == 2
+        binding.dataTitleTv.text = when (index) {
+            0 -> CommonUtils.getStr(
+                R.string.job_execute_step_description,
+                viewModel.workflowSteps.find { it.stepIndex == viewModel.currentStepData?.stepIndex }?.stepTitle
+                    ?: ""
+            ).toString()
+
+            1 -> CommonUtils.getStr(R.string.job_execute_lock_status_title).toString()
+            2 -> CommonUtils.getStr(R.string.job_execute_colocker_colock_status_title).toString()
+            else -> ""
+        }
     }
 
     private fun BindingAdapter.BindingViewHolder.onStepRVListBinding(holder: BindingAdapter.BindingViewHolder) {
         val itemBinding = holder.getBinding<ItemJobExecuteStepBinding>()
         val item = holder.getModel<IsJobTicketStepDataVo>()
-        itemBinding.stepIconIv.setImageResource(getStepIcon(viewModel.workflowSteps.find { it.stepId == item.stepId }))
+        itemBinding.stepIconIv.setImageResource(getStepIcon(viewModel.workflowSteps.find { it.stepId == item.workflowStepId }))
         itemBinding.stepNameTv.text =
-            viewModel.workflowSteps.find { it.stepId == item.stepId }?.stepTitleShort
+            viewModel.workflowSteps.find { it.stepId == item.workflowStepId }?.stepTitleShort
         itemBinding.stepIndexTv.text = item.stepIndex.toString()
         itemBinding.dividerIv.isVisible = item.stepId != viewModel.ticketStep.last().stepId
         val bg = itemBinding.stepLayout.background
@@ -411,10 +434,15 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                     binding.stepRv.models = viewModel.ticketStep
                     viewModel.currentStepData =
                         viewModel.ticketStep.firstOrNull { it.stepStatus == "0" }
-                    binding.colockerLayout.isVisible =
-                        viewModel.workflowModes.find { it.modeId == viewModel.ticketData?.modeId }?.isColockSupport == true
+                    binding.stepDescriptionTv.text =
+                        viewModel.workflowModes.find { it.modeId == viewModel.ticketData?.modeId }?.modeDescription
                     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)
                 }
             } else {
                 TipDialog.showError(

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

@@ -1,17 +1,14 @@
 package com.grkj.iscs.features.main.fragment.job_manage
 
-import androidx.annotation.OptIn
 import androidx.fragment.app.viewModels
 import com.drake.brv.BindingAdapter
 import com.drake.brv.annotaion.DividerOrientation
 import com.drake.brv.utils.dividerSpace
 import com.drake.brv.utils.grid
-import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
 import com.google.android.material.badge.BadgeDrawable
 import com.google.android.material.badge.BadgeUtils
-import com.google.android.material.badge.ExperimentalBadgeUtils
 import com.grkj.data.data.MainDomainData
 import com.grkj.data.enums.RoleFunctionalPermissionsEnum
 import com.grkj.iscs.R
@@ -102,7 +99,7 @@ class JobManageHomeFragment : BaseFragment<FragmentJobManageHomeBinding>() {
         }
     }
 
-    private fun BindingAdapter.BindingViewHolder.onHomeMenuBinding(holder: BindingAdapter.BindingViewHolder) {
+    private fun onHomeMenuBinding(holder: BindingAdapter.BindingViewHolder) {
         val itemBinding = holder.getBinding<ItemHomeMenuBinding>()
         val item = holder.getModel<MenuItemEntity>()
         itemBinding.homeMenuIv.setImageResource(item.menuIconId)

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

@@ -2,6 +2,7 @@ package com.grkj.iscs.features.main.viewmodel.job_manage
 
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
+import com.grkj.data.data.MainDomainData
 import com.grkj.data.enums.RoleEnum
 import com.grkj.data.model.dos.IsJobTicketStep
 import com.grkj.data.model.dos.WorkflowMode
@@ -21,6 +22,7 @@ import com.grkj.iscs.R
 import com.grkj.ui_base.base.BaseViewModel
 import com.grkj.ui_base.business.BleBusinessManager
 import com.grkj.ui_base.business.ModbusBusinessManager
+import com.grkj.ui_base.config.ISCSConfig
 import com.grkj.ui_base.dialog.TipDialog
 import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.event.LoadingEvent
@@ -90,8 +92,12 @@ 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
+            }
             jobTicketRepository.updateTicketDataStatus(
-                ticketId, (ticketStep.firstOrNull { it.stepStatus == "0" }?.stepIndex ?: -1) + 1
+                ticketId, currentWorkflowStep?.getTicketStatus()?.toInt() ?: 0
             )
             emit(true)
         }
@@ -122,6 +128,16 @@ class JobExecuteViewModel @Inject constructor(
      */
     fun toLock(): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
+            val workflowStep = workflowSteps.find { it.stepId == currentStepData?.workflowStepId }
+            if (workflowStep?.confirmType == 0 && !workflowStep.confirmRoleCode.isNullOrEmpty()) {
+                if (MainDomainData.roleKeys?.contains(
+                        workflowStep.confirmRoleCode!!
+                    ) == false && (workflowStep.confirmUser != null && MainDomainData.userInfo?.userId != workflowStep.confirmUser)
+                ) {
+                    PopTip.tip(com.grkj.ui_base.R.string.you_are_not_locker_tip)
+                    return@liveData
+                }
+            }
             ModbusBusinessManager.checkEquipCount(ticketPoints.count {
                 it.pointStatus == "0" || (it.pointStatus == "2" && workflowRepository.isUnlockBeforeLock(
                     ticketData?.modeId!!
@@ -194,6 +210,16 @@ class JobExecuteViewModel @Inject constructor(
      */
     fun toUnLock(): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
+            val workflowStep = workflowSteps.find { it.stepId == currentStepData?.workflowStepId }
+            if (workflowStep?.confirmType == 0 && !workflowStep.confirmRoleCode.isNullOrEmpty()) {
+                if (MainDomainData.roleKeys?.contains(
+                        workflowStep.confirmRoleCode!!
+                    ) == false && (workflowStep.confirmUser != null && MainDomainData.userInfo?.userId != workflowStep.confirmUser)
+                ) {
+                    PopTip.tip(com.grkj.ui_base.R.string.you_are_not_locker_tip)
+                    return@liveData
+                }
+            }
             if (checkBeforeToUnlock()) {
                 ModbusBusinessManager.checkEquipCount(0, true) { keyMap, _ ->
                     LoadingEvent.sendLoadingEvent()
@@ -274,18 +300,26 @@ class JobExecuteViewModel @Inject constructor(
         return liveData(Dispatchers.IO) {
             workflowSteps = workflowRepository.getStepsByMode(modeId)
             for (stepDataVo in ticketStep) {
-                if (workflowSteps.find { it.stepId == stepDataVo.workflowStepId }?.confirmType != 0) {
+                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)
-                        ticketData?.ticketStatus = (stepDataVo.stepIndex + 1).toString()
+                        val workflowSteps = workflowRepository.getStepsByMode(ticketData!!.modeId)
+                        val currentWorkflowStep = workflowSteps.find {
+                            it.stepId == ticketStep.firstOrNull { it.stepStatus == "0" }?.workflowStepId
+                        }
+                        ticketData?.ticketStatus =
+                            currentWorkflowStep?.getTicketStatus() ?: ""
                         jobTicketRepository.updateTicketDataStatus(
-                            ticketId, stepDataVo.stepIndex + 1
+                            ticketId, currentWorkflowStep?.getTicketStatus()?.toInt() ?: 0
                         )
                     }
-                } else if (workflowSteps.find { it.stepId == stepDataVo.workflowStepId }?.confirmType != 0) {
+                } else {
                     break
                 }
             }
@@ -313,8 +347,12 @@ class JobExecuteViewModel @Inject constructor(
             )
             ticketStepData?.let {
                 jobTicketRepository.updateTicketStepData(it)
+                val workflowSteps = workflowRepository.getStepsByMode(ticketData!!.modeId)
+                val currentWorkflowStep = workflowSteps.find {
+                    it.stepId == ticketStep.firstOrNull { it.stepStatus == "0" }?.workflowStepId
+                }
                 jobTicketRepository.updateTicketDataStatus(
-                    ticketId, ticketData?.ticketStatus?.toInt()!! + 1
+                    ticketId, currentWorkflowStep?.getTicketStatus()?.toInt() ?: 0
                 )
                 emit(true)
             } ?: emit(false)

+ 1 - 5
app/src/main/res/drawable/bg_common_input_disable.xml

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

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

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

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

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

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

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

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

@@ -73,25 +73,37 @@
                     android:layout_marginHorizontal="@dimen/common_spacing"
                     android:layout_marginTop="@dimen/common_spacing_2x" />
 
+
                 <LinearLayout
                     android:layout_width="match_parent"
                     android:layout_height="60dp"
                     android:layout_marginHorizontal="@dimen/common_spacing_2x"
-                    android:background="@drawable/common_card_bg"
+                    android:background="@drawable/common_layout_bg"
                     android:divider="@drawable/divider_table"
                     android:gravity="center"
                     android:orientation="horizontal"
                     android:showDividers="middle">
 
-                    <ImageView
-                        android:layout_width="@dimen/job_execute_info_size"
-                        android:layout_height="@dimen/job_execute_info_size"
-                        android:layout_marginHorizontal="@dimen/common_spacing"
-                        android:src="@mipmap/icon_job_execute_info" />
+                    <FrameLayout
+                        android:id="@+id/description_tab"
+                        android:layout_width="wrap_content"
+                        android:layout_height="match_parent"
+                        android:background="@drawable/bg_common_select">
+
+                        <ImageView
+                            android:layout_width="@dimen/job_execute_info_size"
+                            android:layout_height="@dimen/job_execute_info_size"
+                            android:layout_gravity="center"
+                            android:layout_marginHorizontal="@dimen/common_spacing"
+                            android:src="@mipmap/icon_job_execute_info" />
+
+                    </FrameLayout>
 
                     <RelativeLayout
+                        android:id="@+id/locker_tab"
                         android:layout_width="0dp"
-                        android:layout_height="wrap_content"
+                        android:layout_height="match_parent"
+                        android:background="@drawable/bg_common_select"
                         android:layout_weight="1">
 
                         <TextView
@@ -123,8 +135,10 @@
 
 
                     <RelativeLayout
+                        android:id="@+id/colocker_tab"
                         android:layout_width="0dp"
-                        android:layout_height="wrap_content"
+                        android:layout_height="match_parent"
+                        android:background="@drawable/bg_common_select"
                         android:layout_weight="1">
 
                         <TextView
@@ -251,7 +265,7 @@
                             <LinearLayout
                                 android:layout_width="match_parent"
                                 android:layout_height="@dimen/colocker_layout_height"
-                                android:background="@drawable/common_card_bg"
+                                android:background="@drawable/common_layout_bg"
                                 android:divider="@drawable/divider_table"
                                 android:showDividers="middle">
 

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

@@ -4,7 +4,7 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="@dimen/point_header_height"
-        android:background="@drawable/common_card_bg"
+        android:background="@drawable/common_layout_bg"
         android:divider="@drawable/divider_table"
         android:showDividers="middle">
 

+ 28 - 14
app/src/main/res/layout/fragment_job_execute.xml

@@ -83,16 +83,27 @@
                     android:orientation="horizontal"
                     android:showDividers="middle">
 
-                    <ImageView
-                        android:layout_width="@dimen/job_execute_info_size"
-                        android:layout_height="@dimen/job_execute_info_size"
-                        android:layout_marginHorizontal="@dimen/common_spacing"
-                        android:src="@mipmap/icon_job_execute_info" />
+                    <FrameLayout
+                        android:id="@+id/description_tab"
+                        android:layout_width="wrap_content"
+                        android:layout_height="match_parent"
+                        android:background="@drawable/bg_common_select">
+
+                        <ImageView
+                            android:layout_width="@dimen/job_execute_info_size"
+                            android:layout_height="@dimen/job_execute_info_size"
+                            android:layout_gravity="center"
+                            android:layout_marginHorizontal="@dimen/common_spacing"
+                            android:src="@mipmap/icon_job_execute_info" />
+
+                    </FrameLayout>
 
                     <RelativeLayout
+                        android:id="@+id/locker_tab"
                         android:layout_width="0dp"
-                        android:layout_height="wrap_content"
-                        android:layout_weight="1">
+                        android:layout_height="match_parent"
+                        android:layout_weight="1"
+                        android:background="@drawable/bg_common_select">
 
                         <TextView
                             android:id="@+id/lock_tv"
@@ -123,9 +134,11 @@
 
 
                     <RelativeLayout
+                        android:id="@+id/colocker_tab"
                         android:layout_width="0dp"
-                        android:layout_height="wrap_content"
-                        android:layout_weight="1">
+                        android:layout_height="match_parent"
+                        android:layout_weight="1"
+                        android:background="@drawable/bg_common_select">
 
                         <TextView
                             android:id="@+id/colock_tv"
@@ -198,7 +211,8 @@
                             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"
@@ -251,7 +265,7 @@
                             <LinearLayout
                                 android:layout_width="match_parent"
                                 android:layout_height="@dimen/colocker_layout_height"
-                                android:background="@drawable/common_card_bg"
+                                android:background="@drawable/common_layout_bg"
                                 android:divider="@drawable/divider_table"
                                 android:showDividers="middle">
 
@@ -286,7 +300,7 @@
                             <LinearLayout
                                 android:layout_width="match_parent"
                                 android:layout_height="match_parent"
-                                android:background="@drawable/common_card_bg"
+                                android:background="@drawable/common_layout_bg"
                                 android:divider="@drawable/divider_table"
                                 android:orientation="horizontal"
                                 android:showDividers="middle">
@@ -318,8 +332,8 @@
                             android:id="@+id/step_description_tv"
                             android:layout_width="match_parent"
                             android:layout_height="match_parent"
-                            android:textSize="@dimen/common_text_size"
-                            android:visibility="gone" />
+                            android:padding="@dimen/common_spacing"
+                            android:textSize="@dimen/common_text_size" />
                     </FrameLayout>
                 </LinearLayout>
 

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

@@ -4,7 +4,7 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="@dimen/point_header_height"
-        android:background="@drawable/common_card_bg"
+        android:background="@drawable/common_layout_bg"
         android:divider="@drawable/divider_table"
         android:showDividers="middle">
 

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

@@ -372,5 +372,8 @@
     <string name="lock_name">Lock Code</string>
     <string name="rfid_token_manage_title">RFID Manage</string>
     <string name="rfid_name">RFID Code</string>
+    <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>
 
 </resources>

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

@@ -372,5 +372,8 @@
     <string name="lock_name">挂锁名称</string>
     <string name="rfid_token_manage_title">RFID管理</string>
     <string name="rfid_name">RFID编号</string>
+    <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>
 
 </resources>

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

@@ -375,5 +375,8 @@
     <string name="lock_name">挂锁名称</string>
     <string name="rfid_token_manage_title">RFID管理</string>
     <string name="rfid_name">RFID编号</string>
+    <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>
 
 </resources>

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

@@ -313,7 +313,7 @@ interface JobTicketDao {
                 "  SELECT 1 " +
                 "  FROM is_job_ticket_step ijts" +
                 "  WHERE ijts.ticket_id   = ijt.ticket_id" +
-                "    AND ijts.step_status = 0" +
+                "    AND ijts.step_status > 0" +
                 ")"
     )
     fun getInProgressJobSize(): Int

+ 25 - 1
data/src/main/java/com/grkj/data/model/dos/WorkflowStep.kt

@@ -2,7 +2,9 @@ package com.grkj.data.model.dos
 
 import androidx.room.ColumnInfo
 import androidx.room.Entity
+import androidx.room.Ignore
 import androidx.room.PrimaryKey
+import com.grkj.data.enums.JobTicketStatusEnum
 
 /**
  * 工作流步骤表实体
@@ -121,4 +123,26 @@ data class WorkflowStep(
     /** 租户编号 */
     @ColumnInfo(name = "tenant_id")
     var tenantId: Long = 0
-)
+) {
+    /**
+     * 根据参数判断作业票状态
+     */
+    @Ignore
+    fun getTicketStatus(): String {
+        return when {
+            enableSetLocker || enableSetColocker -> JobTicketStatusEnum.SELECT_MEMBER.status
+            enableLock -> JobTicketStatusEnum.LOCKING.status
+            enableColock || enableReleaseColock -> JobTicketStatusEnum.COLOCKING.status
+            enableUnlock -> JobTicketStatusEnum.UNLOCKING.status
+            else -> "0"
+        }
+    }
+
+    /**
+     * 是否有任何需要操作的功能
+     */
+    @Ignore
+    fun hasAnyOperationFunction(): Boolean {
+        return enableSetLocker || enableSetColocker || enableLock || enableColock || enableAddColocker || enableReduceColocker || enableReleaseColock || enableUnlock || enableEndJob
+    }
+}

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

@@ -104,6 +104,7 @@ class JobTicketRepository @Inject constructor(
                 isJobTicketStep.stepIndex = workflowStep.stepIndex
                 isJobTicketStep.stepContent = workflowStep.stepTitle
                 isJobTicketStep.androidStepContent = workflowStep.stepTitleShort
+                isJobTicketStep.workflowStepId = workflowStep.stepId
                 add(isJobTicketStep)
             }
         }

+ 15 - 4
ui-base/src/main/java/com/grkj/ui_base/business/BleBusinessManager.kt

@@ -623,10 +623,6 @@ object BleBusinessManager {
                                     PopTip.tip(R.string.key_return_success)
                                     return@updateKeyReturn
                                 }
-                                RepositoryManager.jobTicketRepo.updateTicketDataStatus(
-                                    data.taskCode?.toLong()!!,
-                                    jobTicketData.ticketStatus.toInt() + 1
-                                )
                                 val ticketStepDataVo =
                                     RepositoryManager.jobTicketRepo.getJobTicketStepDataByTicketId(
                                         data.taskCode?.toLong()!!
@@ -639,6 +635,21 @@ object BleBusinessManager {
                                     logger.info("更新步骤:${it}")
                                     RepositoryManager.jobTicketRepo.updateTicketStepData(it)
                                 }
+                                val workflowSteps =
+                                    RepositoryManager.workflowRepository.getStepsByMode(
+                                        jobTicketData.modeId!!
+                                    )
+                                val ticketStep =
+                                    RepositoryManager.jobTicketRepo.getJobTicketStepDataByTicketId(
+                                        jobTicketData.ticketId
+                                    )
+                                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)

+ 2 - 2
ui-base/src/main/java/com/grkj/ui_base/utils/CommonUtils.kt

@@ -48,9 +48,9 @@ object CommonUtils {
     /**
      * 获取资源文本
      */
-    fun getStr(textId: Int, ctx: Context? = null, vararg args: Any): String? {
+    fun getStr(textId: Int, vararg args: Any): String? {
         // 优先用传入的 ctx,否则用全局 Application context
-        val realCtx = ctx ?: SIKCore.getApplication().applicationContext!!
+        val realCtx =SIKCore.getApplication().applicationContext!!
 
         return if (args.isNotEmpty()) {
             // 注意这里的 *args

+ 62 - 42
ui-base/src/main/java/com/grkj/ui_base/utils/extension/View.kt

@@ -10,6 +10,7 @@ import androidx.fragment.app.Fragment
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.LinearSmoothScroller
 import androidx.recyclerview.widget.RecyclerView
+import com.grkj.ui_base.R
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
@@ -87,60 +88,79 @@ fun Fragment.toggleExpandView(
     rootFrame: FrameLayout,
     targetView: View,
     isExpanded: Boolean,
-    expandedWidthRatio: Float = 0.95f,
-    expandedHeightRatio: Float = 0.8f
+    expandedWidthRatio: Float = 1f,
+    expandedHeightRatio: Float = 1f,
+    animDuration: Long = 400L
 ): Boolean {
-    val expandedTag = "expanded_original_params"
+    // 唯一的 key,避免和别的 tag 冲突
+    val KEY_PARENT = R.id.expand_tag_parent
+    val KEY_LP     = R.id.expand_tag_lp
+    val KEY_INDEX  = R.id.expand_tag_index
 
     if (!isExpanded) {
-        // 记录原始布局参数
-        targetView.tag = targetView.layoutParams
-
-        val layoutParams = FrameLayout.LayoutParams(
-            (Resources.getSystem().displayMetrics.widthPixels * expandedWidthRatio).toInt(),
-            (Resources.getSystem().displayMetrics.heightPixels * expandedHeightRatio).toInt()
-        ).apply {
-            gravity = Gravity.CENTER
-        }
-
-        // 提高z轴,带阴影
-        targetView.elevation = 20f.dpToPx(requireContext())
-
-        // 从原父容器移除,加入rootFrame
+        // —— 记录原始数据 ——
         val parent = targetView.parent as ViewGroup
+        targetView.setTag(KEY_PARENT, parent)
+        // 记录原始 LayoutParams(可直接复用)
+        targetView.setTag(KEY_LP, targetView.layoutParams)
+        // 记录原来在父容器的索引
+        targetView.setTag(KEY_INDEX, parent.indexOfChild(targetView))
+
+        // 构造新的全屏 LayoutParams
+        val newLp = FrameLayout.LayoutParams(
+            (rootFrame.width * expandedWidthRatio).toInt(),
+            (rootFrame.height * expandedHeightRatio).toInt()
+        ).apply { gravity = Gravity.CENTER }
+
+        // 移除 & 添加到 rootFrame
         parent.removeView(targetView)
-        rootFrame.addView(targetView, layoutParams)
-    } else {
-        // 还原原始布局参数
-        val originalParams = targetView.tag as ViewGroup.LayoutParams?
+        rootFrame.addView(targetView, newLp)
 
-        if (originalParams != null) {
-            // 降低z轴,移除阴影
-            targetView.elevation = 0f
+        // 初始动画状态
+        targetView.scaleX = 0.8f
+        targetView.scaleY = 0.8f
+        targetView.alpha  = 0f
+        targetView.elevation = 20f.dpToPx(requireContext())
 
-            // 从rootFrame移除,恢复到原容器
-            rootFrame.removeView(targetView)
+        // 播放展开动画
+        targetView.animate()
+            .scaleX(1f)
+            .scaleY(1f)
+            .alpha(1f)
+            .setDuration(animDuration)
+            .start()
 
-            // 这里要确保你原来的容器能够接回targetView
-            val originalParent = findOriginalParent(targetView)
-            originalParent?.addView(targetView, originalParams)
-        }
+    } else {
+        // —— 收回动画 ——
+        targetView.animate()
+            .scaleX(0.8f)
+            .scaleY(0.8f)
+            .alpha(0f)
+            .setDuration(animDuration)
+            .withEndAction {
+                // 取回记录
+                val originalParent = targetView.getTag(KEY_PARENT) as ViewGroup
+                val originalLp     = targetView.getTag(KEY_LP)     as ViewGroup.LayoutParams
+                val originalIndex  = targetView.getTag(KEY_INDEX)  as Int
+
+                // 清除阴影
+                targetView.elevation = 0f
+
+                // 从 rootFrame 移除,恢复到原索引位置
+                rootFrame.removeView(targetView)
+                originalParent.addView(targetView, originalIndex, originalLp)
+
+                // 恢复属性
+                targetView.scaleX = 1f
+                targetView.scaleY = 1f
+                targetView.alpha  = 1f
+            }
+            .start()
     }
 
     return !isExpanded
 }
 
-// 扩展函数 dp转px
+// dp  px
 fun Float.dpToPx(context: Context): Float =
     this * context.resources.displayMetrics.density
-
-// 一个辅助函数,记录或找到原始父布局
-private fun findOriginalParent(view: View): ViewGroup? {
-    return view.getTag(view.id) as? ViewGroup
-}
-
-// 使用前初始化,记录原始父布局
-fun View.recordOriginalParent() {
-    setTag(id, parent)
-}
-

+ 1 - 0
ui-base/src/main/res/drawable/common_layout_bg.xml

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

+ 2 - 0
ui-base/src/main/res/values/colors.xml

@@ -23,6 +23,7 @@
     <color name="common_bg_black_30">#4D000000</color>
 
     <color name="common_light_gray">#CCCCCC</color>
+    <color name="common_selected_gray">#80808080</color>
     <color name="common_dlg_bg">#535B67</color>
 
     <color name="scrim">#99000000</color>
@@ -52,4 +53,5 @@
     <color name="dirtyColor">#F44336</color>
     <color name="color_008000">#008000</color>
     <color name="color_ff0000">#ff0000</color>
+    <color name="color_e9ecf4">#e9ecf4</color>
 </resources>

+ 6 - 0
ui-base/src/main/res/values/ids.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <item type="id" name="expand_tag_parent"/>
+    <item type="id" name="expand_tag_lp"/>
+    <item type="id" name="expand_tag_index"/>
+</resources>