소스 검색

refactor(更新)
- 头像不存在报错问题处理
- 异常作业过滤
- 一件处理异常之后不刷新的问题处理

周文健 4 달 전
부모
커밋
927f530ec0
20개의 변경된 파일234개의 추가작업 그리고 86개의 파일을 삭제
  1. 5 3
      app/src/main/java/com/grkj/iscs/features/main/activity/MainActivity.kt
  2. 12 6
      app/src/main/java/com/grkj/iscs/features/main/fragment/common/SelectMemberFragment.kt
  3. 8 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/exception_manage/ExceptionDetailFragment.kt
  4. 18 4
      app/src/main/java/com/grkj/iscs/features/main/fragment/exception_manage/ExceptionJobFragment.kt
  5. 5 2
      app/src/main/java/com/grkj/iscs/features/main/fragment/exception_manage/ExceptionManageFragment.kt
  6. 8 4
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateJobFragment.kt
  7. 8 4
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateSopFragment.kt
  8. 8 4
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateSopJobFragment.kt
  9. 8 4
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditJobFragment.kt
  10. 8 4
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditSopFragment.kt
  11. 8 4
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditSopJobFragment.kt
  12. 2 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/ExceptionJobManageFragment.kt
  13. 42 23
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/exception_manage/ExceptionViewModel.kt
  14. 4 2
      app/src/main/res/layout/fragment_exception_detail.xml
  15. 1 1
      app/src/main/res/values-zh/strings.xml
  16. 1 1
      app/src/main/res/values/strings.xml
  17. 1 1
      data/src/main/java/com/grkj/data/dao/ExceptionDao.kt
  18. 2 1
      data/src/main/java/com/grkj/data/enums/CommonDictDataEnum.kt
  19. 4 1
      data/src/main/java/com/grkj/data/model/vo/IsExceptionStandardVo.kt
  20. 81 15
      data/src/main/java/com/grkj/data/repository/impl/standard/ExceptionRepository.kt

+ 5 - 3
app/src/main/java/com/grkj/iscs/features/main/activity/MainActivity.kt

@@ -82,9 +82,11 @@ class MainActivity() : BaseActivity<ActivityMainBinding>() {
         binding.nickname.text = MainDomainData.userInfo?.nickName ?: ""
         (MainDomainData.userInfo?.avatar
             ?: MainDomainData.userBiometricDataVo.find { it.type == "2" }?.content)?.let {
-            val faceData = it.file().readText()
-            val avatar = ImageConvertUtils.base64ToBitmap(faceData)
-            binding.avatar.load(avatar)
+            if (it.isNotEmpty()) {
+                val faceData = it.file().readText()
+                val avatar = ImageConvertUtils.base64ToBitmap(faceData)
+                binding.avatar.load(avatar)
+            }
         }
         // 1. 拆出两个可选控件
         // 2. 清空原有菜单

+ 12 - 6
app/src/main/java/com/grkj/iscs/features/main/fragment/common/SelectMemberFragment.kt

@@ -103,8 +103,10 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
         itemBinding.lockerIcon.isSelected = item.isSelected
         (item.avatar
             ?: viewModel.userBiometricDataVo.find { it.userId == item.userId }?.content)?.let {
-            val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
-            itemBinding.lockerIcon.load(avatar)
+            if (it.isNotEmpty()) {
+                val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
+                itemBinding.lockerIcon.load(avatar)
+            }
         } ?: itemBinding.lockerIcon.setImageResource(R.drawable.icon_select_member)
         itemBinding.root.setOnClickListener {
             if (item.isSelected) {
@@ -152,8 +154,10 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
         itemBinding.lockerIcon.isSelected = true
         (item.avatar
             ?: viewModel.userBiometricDataVo.find { it.userId == item.userId }?.content)?.let {
-            val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
-            itemBinding.lockerIcon.load(avatar)
+            if (it.isNotEmpty()) {
+                val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
+                itemBinding.lockerIcon.load(avatar)
+            }
         } ?: itemBinding.lockerIcon.setImageResource(R.drawable.icon_select_member)
         itemBinding.root.setOnClickListener {
             if (selectedLockerData.size == 1 && viewModel.jobTicketData != null && viewModel.jobTicketData?.ticketStatus != JobTicketStatusEnum.SELECT_MEMBER.status) {
@@ -174,8 +178,10 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
         itemBinding.lockerIcon.isSelected = true
         (item.avatar
             ?: viewModel.userBiometricDataVo.find { it.userId == item.userId }?.content)?.let {
-            val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
-            itemBinding.lockerIcon.load(avatar)
+            if (it.isNotEmpty()) {
+                val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
+                itemBinding.lockerIcon.load(avatar)
+            }
         } ?: itemBinding.lockerIcon.setImageResource(R.drawable.icon_select_member)
         itemBinding.root.setOnClickListener {
             if (selectedColockerData.size == 1 || (viewModel.ticketUsers.isNotEmpty() && viewModel.ticketUsers.find { it.userId == item.userId }?.jobStatus == "1")) {

+ 8 - 1
app/src/main/java/com/grkj/iscs/features/main/fragment/exception_manage/ExceptionDetailFragment.kt

@@ -69,13 +69,20 @@ class ExceptionDetailFragment : BaseFragment<FragmentExceptionDetailBinding>() {
             .getData(DataTransferConstants.KEY_EXCEPTION_DATA) as IsExceptionStandardVo
         viewModel.getDictData().observe(this) {
             viewModel.getExceptionSourceName().observe(this) {
+                binding.handleException.isVisible =
+                    viewModel.exceptionStatus.find { it.dictLabel == "待处理" }?.dictValue == viewModel.exceptionData?.exceptionStatus.toString()
+                binding.cancelException.isVisible =
+                    viewModel.exceptionStatus.find { it.dictLabel == "待处理" }?.dictValue == viewModel.exceptionData?.exceptionStatus.toString()
                 binding.exceptionType.text =
                     viewModel.exceptionType.find { it.dictValue == viewModel.exceptionData?.exceptionType.toString() }?.dictLabel
                 binding.exceptionSource.text = it
+                binding.exceptionStatus.text =
+                    viewModel.exceptionStatus.find { it.dictValue == viewModel.exceptionData?.exceptionStatus.toString() }?.dictLabel
                 binding.exceptionReporter.text = viewModel.exceptionData?.userData?.nickName
                 binding.exceptionOccurrenceTime.text = viewModel.exceptionData?.occurrenceTime
                 binding.exceptionReleaseTime.text = viewModel.exceptionData?.releaseTime
-                binding.exceptionDescription.text = viewModel.exceptionData?.exceptionDescription?.joinToString(",")
+                binding.exceptionDescription.text =
+                    viewModel.exceptionData?.exceptionDescription?.joinToString(",")
             }
         }
     }

+ 18 - 4
app/src/main/java/com/grkj/iscs/features/main/fragment/exception_manage/ExceptionJobFragment.kt

@@ -31,10 +31,12 @@ import com.grkj.ui_base.utils.extension.toggleExpandView
 import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.extension.setDebouncedClickListener
+import dagger.hilt.android.AndroidEntryPoint
 
 /**
  * 异常作业界面
  */
+@AndroidEntryPoint
 class ExceptionJobFragment : BaseFragment<FragmentExceptionJobBinding>() {
     private val viewModel: ExceptionJobViewModel by viewModels()
     private var currentTab: Int = 0
@@ -238,11 +240,23 @@ class ExceptionJobFragment : BaseFragment<FragmentExceptionJobBinding>() {
             navController.popBackStack()
             return
         }
+        val ticketId = GlobalDataTempStore.getInstance()
+            .getData(DataTransferConstants.KEY_JOB_TICKET_ID)
+        val exceptionId = GlobalDataTempStore.getInstance()
+            .getData(DataTransferConstants.KEY_EXCEPTION_ID)
+        if (ticketId == null) {
+            PopTip.tip(R.string.job_lost)
+            navController.popBackStack()
+            return
+        }
+        if (exceptionId == null) {
+            PopTip.tip(R.string.exception_lost)
+            navController.popBackStack()
+            return
+        }
         viewModel.getWorkflowModes().observe(this) {
-            viewModel.ticketId = GlobalDataTempStore.getInstance()
-                .getData(DataTransferConstants.KEY_JOB_TICKET_ID) as Long
-            viewModel.exceptionId = GlobalDataTempStore.getInstance()
-                .getData(DataTransferConstants.KEY_EXCEPTION_ID) as Long
+            viewModel.ticketId = ticketId as Long
+            viewModel.exceptionId = exceptionId as Long
             getData()
         }
     }

+ 5 - 2
app/src/main/java/com/grkj/iscs/features/main/fragment/exception_manage/ExceptionManageFragment.kt

@@ -16,7 +16,6 @@ import com.grkj.iscs.databinding.ItemExceptionManageBinding
 import com.grkj.iscs.features.main.viewmodel.exception_manage.ExceptionViewModel
 import com.grkj.ui_base.base.BaseFragment
 import com.grkj.ui_base.dialog.TipDialog
-import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.extension.setDebouncedClickListener
 import dagger.hilt.android.AndroidEntryPoint
@@ -37,6 +36,7 @@ class ExceptionManageFragment : BaseFragment<FragmentExceptionManageBinding>() {
             viewModel.handleSelectedException().observe(this) {
                 if (it.first) {
                     TipDialog.showSuccess(getString(R.string.handle_exception_success))
+                    getData()
                 } else {
                     TipDialog.showError(it.second)
                 }
@@ -45,6 +45,7 @@ class ExceptionManageFragment : BaseFragment<FragmentExceptionManageBinding>() {
         binding.oneKeyCancel.setDebouncedClickListener {
             viewModel.cancelSelectedException().observe(this) {
                 TipDialog.showSuccess(getString(R.string.cancel_exception_success))
+                getData()
             }
         }
         binding.listRv.linear().divider {
@@ -69,6 +70,9 @@ class ExceptionManageFragment : BaseFragment<FragmentExceptionManageBinding>() {
     private fun getData() {
         viewModel.getDictData().observe(this) {
             viewModel.getExceptionData().observe(this) {
+                binding.selectAll.setOnCheckedChangeListener(null)
+                binding.selectAll.isChecked =false
+                setSelectAllListener()
                 binding.listRv.models = viewModel.exceptionDataList
             }
         }
@@ -86,7 +90,6 @@ class ExceptionManageFragment : BaseFragment<FragmentExceptionManageBinding>() {
         val item = holder.getModel<IsExceptionStandardVo>()
         itemBinding.exceptionType.text = viewModel.exceptionType
             .find { it.dictValue == item.exceptionType.toString() }?.dictLabel
-
         itemBinding.exceptionStatus.text =
             viewModel.exceptionStatus.find { it.dictValue == item.exceptionStatus.toString() }?.dictLabel
         itemBinding.exceptionOccurrenceTime.text = item.occurrenceTime

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

@@ -465,8 +465,10 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
         itemBinding.lockerIcon.isSelected = true
         (item.avatar
             ?: viewModel.userBiometricDataVo.find { it.userId == item.userId }?.content)?.let {
-            val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
-            itemBinding.lockerIcon.load(avatar)
+            if (it.isNotEmpty()) {
+                val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
+                itemBinding.lockerIcon.load(avatar)
+            }
         } ?: itemBinding.lockerIcon.setImageResource(R.drawable.icon_select_member)
     }
 
@@ -514,8 +516,10 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
                     binding.lockerName.text = userData.nickName
                     (userData.avatar
                         ?: viewModel.userBiometricDataVo.find { it.userId == userData.userId }?.content)?.let {
-                        val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
-                        binding.lockerIv.load(avatar)
+                        if (it.isNotEmpty()) {
+                            val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
+                            binding.lockerIv.load(avatar)
+                        }
                     } ?: binding.lockerIv.setImageResource(R.drawable.icon_select_member)
                 }
             }

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

@@ -368,8 +368,10 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
         itemBinding.lockerIcon.isSelected = true
         (item.avatar
             ?: viewModel.userBiometricDataVo.find { it.userId == item.userId }?.content)?.let {
-            val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
-            itemBinding.lockerIcon.load(avatar)
+            if (it.isNotEmpty()) {
+                val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
+                itemBinding.lockerIcon.load(avatar)
+            }
         } ?: itemBinding.lockerIcon.setImageResource(R.drawable.icon_select_member)
     }
 
@@ -416,8 +418,10 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
                 binding.lockerName.text = userData.nickName
                 (userData.avatar
                     ?: viewModel.userBiometricDataVo.find { it.userId == userData.userId }?.content)?.let {
-                    val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
-                    binding.lockerIv.load(avatar)
+                    if (it.isNotEmpty()) {
+                        val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
+                        binding.lockerIv.load(avatar)
+                    }
                 } ?: binding.lockerIv.setImageResource(R.drawable.icon_select_member)
             }
         }

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

@@ -318,8 +318,10 @@ class CreateSopJobFragment : BaseFormFragment<FragmentCreateSopJobBinding>() {
         itemBinding.lockerIcon.isSelected = true
         (item.avatar
             ?: viewModel.userBiometricDataVo.find { it.userId == item.userId }?.content)?.let {
-            val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
-            itemBinding.lockerIcon.load(avatar)
+            if (it.isNotEmpty()) {
+                val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
+                itemBinding.lockerIcon.load(avatar)
+            }
         } ?: itemBinding.lockerIcon.setImageResource(R.drawable.icon_select_member)
     }
 
@@ -358,8 +360,10 @@ class CreateSopJobFragment : BaseFormFragment<FragmentCreateSopJobBinding>() {
                 binding.lockerName.text = userData.nickName
                 (userData.avatar
                     ?: viewModel.userBiometricDataVo.find { it.userId == userData.userId }?.content)?.let {
-                    val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
-                    binding.lockerIv.load(avatar)
+                    if (it.isNotEmpty()) {
+                        val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
+                        binding.lockerIv.load(avatar)
+                    }
                 } ?: binding.lockerIv.setImageResource(R.drawable.icon_select_member)
             }
         }

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

@@ -323,8 +323,10 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
         itemBinding.lockerIcon.isSelected = true
         (item.avatar
             ?: viewModel.userBiometricDataVo.find { it.userId == item.userId }?.content)?.let {
-            val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
-            itemBinding.lockerIcon.load(avatar)
+            if (it.isNotEmpty()) {
+                val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
+                itemBinding.lockerIcon.load(avatar)
+            }
         } ?: itemBinding.lockerIcon.setImageResource(R.drawable.icon_select_member)
     }
 
@@ -399,8 +401,10 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
             binding.lockerName.text = userData.nickName
             (userData.avatar
                 ?: viewModel.userBiometricDataVo.find { it.userId == userData.userId }?.content)?.let {
-                val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
-                binding.lockerIv.load(avatar)
+                if (it.isNotEmpty()) {
+                    val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
+                    binding.lockerIv.load(avatar)
+                }
             } ?: binding.lockerIv.setImageResource(R.drawable.icon_select_member)
         }
         if (selectedPointData.isNotEmpty()) {

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

@@ -289,8 +289,10 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
         itemBinding.lockerIcon.isSelected = true
         (item.avatar
             ?: viewModel.userBiometricDataVo.find { it.userId == item.userId }?.content)?.let {
-            val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
-            itemBinding.lockerIcon.load(avatar)
+            if (it.isNotEmpty()) {
+                val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
+                itemBinding.lockerIcon.load(avatar)
+            }
         } ?: itemBinding.lockerIcon.setImageResource(R.drawable.icon_select_member)
     }
 
@@ -369,8 +371,10 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
             binding.lockerName.text = userData.nickName
             (userData.avatar
                 ?: viewModel.userBiometricDataVo.find { it.userId == userData.userId }?.content)?.let {
-                val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
-                binding.lockerIv.load(avatar)
+                if (it.isNotEmpty()) {
+                    val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
+                    binding.lockerIv.load(avatar)
+                }
             } ?: binding.lockerIv.setImageResource(R.drawable.icon_select_member)
         }
         if (selectedPointData.isNotEmpty()) {

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

@@ -310,8 +310,10 @@ class EditSopJobFragment : BaseFormFragment<FragmentEditSopJobBinding>() {
         itemBinding.lockerIcon.isSelected = true
         (item.avatar
             ?: viewModel.userBiometricDataVo.find { it.userId == item.userId }?.content)?.let {
-            val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
-            itemBinding.lockerIcon.load(avatar)
+            if (it.isNotEmpty()) {
+                val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
+                itemBinding.lockerIcon.load(avatar)
+            }
         } ?: itemBinding.lockerIcon.setImageResource(R.drawable.icon_select_member)
     }
 
@@ -377,8 +379,10 @@ class EditSopJobFragment : BaseFormFragment<FragmentEditSopJobBinding>() {
             binding.lockerName.text = userData.nickName
             (userData.avatar
                 ?: viewModel.userBiometricDataVo.find { it.userId == userData.userId }?.content)?.let {
-                val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
-                binding.lockerIv.load(avatar)
+                if (it.isNotEmpty()) {
+                    val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
+                    binding.lockerIv.load(avatar)
+                }
             } ?: binding.lockerIv.setImageResource(R.drawable.icon_select_member)
         }
         if (selectedPointData.isNotEmpty()) {

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

@@ -18,6 +18,7 @@ import com.grkj.ui_base.base.BaseFragment
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.extension.setDebouncedClickListener
 import dagger.hilt.android.AndroidEntryPoint
+import kotlin.collections.filter
 
 /**
  * 异常作业
@@ -73,7 +74,7 @@ class ExceptionJobManageFragment : BaseFragment<FragmentExceptionJobManageBindin
 
     private fun getData() {
         viewModel.getDictData().observe(this) {
-            viewModel.getExceptionData().observe(this) {
+            viewModel.getExceptionJobData().observe(this) {
                 binding.listRv.models = viewModel.exceptionDataList
             }
         }

+ 42 - 23
app/src/main/java/com/grkj/iscs/features/main/viewmodel/exception_manage/ExceptionViewModel.kt

@@ -6,12 +6,12 @@ import com.grkj.data.data.DictConstants
 import com.grkj.data.model.dos.IsExceptionSourceStandard
 import com.grkj.data.model.dos.IsExceptionStandard
 import com.grkj.data.model.res.CommonDictRes
-import com.grkj.iscs.features.main.entity.ExceptionSourceDataEntity
 import com.grkj.data.model.vo.IsExceptionStandardVo
 import com.grkj.data.repository.IExceptionRepository
 import com.grkj.data.repository.IHardwareRepository
 import com.grkj.data.repository.IJobTicketRepository
 import com.grkj.iscs.R
+import com.grkj.iscs.features.main.entity.ExceptionSourceDataEntity
 import com.grkj.ui_base.base.BaseViewModel
 import com.grkj.ui_base.business.DataBusiness
 import com.grkj.ui_base.utils.CommonUtils
@@ -138,6 +138,26 @@ class ExceptionViewModel @Inject constructor(
         }
     }
 
+    /**
+     * 获取异常作业数据
+     */
+    fun getExceptionJobData(): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            exceptionDataList = exceptionRepository.getExceptionData()
+                .filter { it.exceptionType.toString() == exceptionType.find { it.dictLabel == "作业异常" }?.dictValue }
+            exceptionDataList.forEach { item ->
+                item.sourceData.find { it.sourceDataType.toString() == exceptionSourceDataType.find { it.dictLabel == "作业" }?.dictValue }
+                    ?.let { sourceData ->
+                        jobTicketRepository.getTicketDataByTicketId(sourceData.sourceDataId)
+                            ?.let {
+                                item.jobTicketData = it
+                            }
+                    }
+            }
+            emit(true)
+        }
+    }
+
     /**
      * 处理选中异常
      */
@@ -187,29 +207,29 @@ class ExceptionViewModel @Inject constructor(
      */
     fun getExceptionSourceName(): LiveData<String> {
         return liveData(Dispatchers.IO) {
-            val sourceName = exceptionData?.sourceData?.map {
-                when (it.sourceDataType) {
-                    //钥匙
-                    0 -> {
-                        "钥匙:${hardwareRepository.getKeyInfoByKeyId(it.sourceDataId)?.keyNfc}"
-                    }
-                    //挂锁
-                    1 -> {
-                        "挂锁:${hardwareRepository.getLockInfoByLockId(it.sourceDataId)?.lockNfc}"
-                    }
-                    //仓位
-                    2 -> {
-                        val slotData =
-                            hardwareRepository.getIsLockCabinetSlotBySlotId(it.sourceDataId)
-                        "仓位:${slotData?.row}-${slotData?.col}"
-                    }
-                    //作业
-                    3 -> {
-                        "作业:${jobTicketRepository.getTicketDataByTicketId(it.sourceDataId)?.ticketName}"
+            val sourceName: String = exceptionData
+                ?.sourceData
+                ?.joinToString(separator = ",") { src ->
+                    when (src.sourceDataType) {
+                        0 -> "钥匙:${hardwareRepository.getKeyInfoByKeyId(src.sourceDataId)?.keyNfc.orEmpty()}"
+                        1 -> "挂锁:${hardwareRepository.getLockInfoByLockId(src.sourceDataId)?.lockNfc.orEmpty()}"
+                        2 -> {
+                            hardwareRepository
+                                .getIsLockCabinetSlotBySlotId(src.sourceDataId)
+                                ?.let { slot -> "仓位:${slot.row}-${slot.col}" }
+                                .orEmpty()
+                        }
+
+                        3 -> "作业:${
+                            jobTicketRepository.getTicketDataByTicketId(src.sourceDataId)
+                                ?.ticketName.orEmpty()
+                        }"
+
+                        else -> ""  // 万一还有其他类型,保证 when 也是“表达式”
                     }
                 }
-            }?.joinToString(",")
-            emit(sourceName.toString())
+                .orEmpty()  // 如果 exceptionData 或 sourceData 为 null,则给个空串
+            emit(sourceName)
         }
     }
 
@@ -309,7 +329,6 @@ class ExceptionViewModel @Inject constructor(
      */
     fun exceptionReport(): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
-
             val exceptionData = IsExceptionStandard()
             exceptionData.exceptionType = selectedExceptionType?.toInt() ?: 0
             exceptionData.exceptionDescription = selectedExceptionDescription

+ 4 - 2
app/src/main/res/layout/fragment_exception_detail.xml

@@ -176,7 +176,8 @@
                 android:paddingHorizontal="@dimen/common_spacing_2x"
                 android:text="@string/cancel_exception"
                 android:textColor="@color/white"
-                android:textSize="@dimen/common_btn_text_size" />
+                android:textSize="@dimen/common_btn_text_size"
+                android:visibility="gone" />
 
             <TextView
                 android:id="@+id/handle_exception"
@@ -190,7 +191,8 @@
                 android:paddingHorizontal="@dimen/common_spacing_2x"
                 android:text="@string/handle_exception"
                 android:textColor="@color/white"
-                android:textSize="@dimen/common_btn_text_size" />
+                android:textSize="@dimen/common_btn_text_size"
+                android:visibility="gone" />
         </LinearLayout>
     </LinearLayout>
 </layout>

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

@@ -408,7 +408,7 @@
     <string name="check_lock_is_new_device">检查挂锁是否为新硬件</string>
     <string name="check_key_is_new_device">检查钥匙是否为新硬件</string>
     <string name="start_scan_key_mac">开始扫描钥匙信息</string>
-    <string name="do_you_want_to_remove_exception">是否确认移除异常</string>
+    <string name="do_you_want_to_remove_exception">是否确认移除异常</string>
     <string name="check_device_info">检测到钥匙%1$d把,挂锁%2$d把</string>
     <string name="exception_type">异常类型:</string>
     <string name="exception_source">异常源:</string>

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

@@ -411,7 +411,7 @@
     <string name="check_lock_is_new_device">检查挂锁是否为新硬件</string>
     <string name="check_key_is_new_device">检查钥匙是否为新硬件</string>
     <string name="start_scan_key_mac">开始扫描钥匙信息</string>
-    <string name="do_you_want_to_remove_exception">是否确认移除异常</string>
+    <string name="do_you_want_to_remove_exception">是否确认移除异常</string>
     <string name="check_device_info">检测到钥匙%1$d把,挂锁%2$d把</string>
     <string name="exception_type">异常类型:</string>
     <string name="exception_source">异常源:</string>

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

@@ -25,7 +25,7 @@ interface ExceptionDao {
      * 获取异常数据
      */
     @Transaction
-    @Query("select * from is_exception_standard")
+    @Query("select * from is_exception_standard order by exception_status asc")
     fun getExceptionData(): List<IsExceptionStandardVo>
 
     /**

+ 2 - 1
data/src/main/java/com/grkj/data/enums/CommonDictDataEnum.kt

@@ -97,7 +97,7 @@ enum class CommonDictDataEnum(val dictKey: String, val commonDictRes: List<Commo
         )
     ),
     EXCEPTION_STATUS(
-        DictConstants.KEY_JOB_TICKET_STATUS, listOf(
+        DictConstants.KEY_EXCEPTION_STATUS, listOf(
             SimpleCommonDictRes("待处理", "0"),
             SimpleCommonDictRes("已处理", "1"),
             SimpleCommonDictRes("已取消", "2"),
@@ -108,6 +108,7 @@ enum class CommonDictDataEnum(val dictKey: String, val commonDictRes: List<Commo
             SimpleCommonDictRes("作业票无法执行", "0"),
             SimpleCommonDictRes("钥匙损坏", "1"),
             SimpleCommonDictRes("挂锁损坏", "2"),
+            SimpleCommonDictRes("仓位损坏", "3"),
         )
     ),
     EXCEPTION_PROCESS_APPLICATION(

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

@@ -3,8 +3,10 @@ package com.grkj.data.model.vo
 import androidx.room.ColumnInfo
 import androidx.room.Ignore
 import androidx.room.Relation
+import com.grkj.data.enums.CommonDictDataEnum
 import com.grkj.data.model.dos.IsExceptionSourceStandard
 import com.grkj.data.model.dos.SysUserDo
+import com.grkj.data.model.res.CommonDictRes
 import com.sik.sikcore.date.TimeUtils
 
 /**
@@ -18,7 +20,8 @@ class IsExceptionStandardVo {
     var exceptionType: Int = 0
 
     @ColumnInfo(name = "exception_status")
-    var exceptionStatus: Int? = null
+    var exceptionStatus: Int? =
+        CommonDictDataEnum.EXCEPTION_STATUS.commonDictRes.find { it.dictLabel == "待处理" }?.dictValue?.toInt()
 
     @ColumnInfo(name = "exception_description")
     var exceptionDescription: List<String>? = null

+ 81 - 15
data/src/main/java/com/grkj/data/repository/impl/standard/ExceptionRepository.kt

@@ -1,6 +1,7 @@
 package com.grkj.data.repository.impl.standard
 
 import com.grkj.data.dao.ExceptionDao
+import com.grkj.data.dao.HardwareDao
 import com.grkj.data.dao.JobTicketDao
 import com.grkj.data.enums.CommonDictDataEnum
 import com.grkj.data.enums.JobTicketStatusEnum
@@ -20,7 +21,8 @@ import javax.inject.Singleton
 @Singleton
 class ExceptionRepository @Inject constructor(
     val exceptionDao: ExceptionDao,
-    val jobTicketDao: JobTicketDao
+    val jobTicketDao: JobTicketDao,
+    val hardwareDao: HardwareDao
 ) : BaseRepository(),
     IExceptionRepository {
     override fun cancelException(exceptionData: List<IsExceptionStandardVo>) {
@@ -29,13 +31,45 @@ class ExceptionRepository @Inject constructor(
                 CommonDictDataEnum.EXCEPTION_STATUS.commonDictRes.find { it.dictLabel == "已取消" }?.dictValue?.toInt()
         }
         exceptionData.flatMap { it.sourceData }
-            .filter { it.sourceDataType == CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find { it.dictLabel == "作业" }?.dictValue?.toInt() }
-            .forEach {
-                jobTicketDao.updateJobTicketExceptionData(
-                    it.sourceDataId,
-                    JobTicketStatusEnum.CANCELED.status,
-                    CommonDictDataEnum.EXCEPTION_STATUS.commonDictRes.find { it.dictLabel == "已取消" }?.dictValue?.toInt()
-                )
+            .forEach { exceptionSource ->
+                when (exceptionSource.sourceDataType) {
+                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find { it.dictLabel == "钥匙" }?.dictValue?.toInt() -> {
+                        val keyInfo = hardwareDao.getKeyInfoById(exceptionSource.sourceDataId)
+                        keyInfo?.exStatus = null
+                        keyInfo?.remark = null
+                        keyInfo?.let {
+                            hardwareDao.updateKeyInfo(it)
+                        }
+                    }
+
+                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find { it.dictLabel == "挂锁" }?.dictValue?.toInt() -> {
+                        val lockInfo =
+                            hardwareDao.getLockInfoById(exceptionSource.sourceDataId)
+                        lockInfo?.exStatus = null
+                        lockInfo?.remark = null
+                        lockInfo?.let {
+                            hardwareDao.updateLockInfo(it)
+                        }
+                    }
+
+                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find { it.dictLabel == "仓位" }?.dictValue?.toInt() -> {
+                        val slotsInfo =
+                            hardwareDao.getIsLockCabinetSlotBySlotId(exceptionSource.sourceDataId)
+                        slotsInfo?.status = null
+                        slotsInfo?.remark = null
+                        slotsInfo?.let {
+                            hardwareDao.updateSlotsInfo(it)
+                        }
+                    }
+
+                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find { it.dictLabel == "作业" }?.dictValue?.toInt() -> {
+                        jobTicketDao.updateJobTicketExceptionData(
+                            exceptionSource.sourceDataId,
+                            JobTicketStatusEnum.CANCELED.status,
+                            CommonDictDataEnum.EXCEPTION_STATUS.commonDictRes.find { it.dictLabel == "已取消" }?.dictValue?.toInt()
+                        )
+                    }
+                }
             }
         val isExceptionData =
             BeanUtils.copyList(exceptionData, IsExceptionStandard::class.java)?.filterNotNull()
@@ -57,13 +91,45 @@ class ExceptionRepository @Inject constructor(
                 CommonDictDataEnum.EXCEPTION_STATUS.commonDictRes.find { it.dictLabel == "已处理" }?.dictValue?.toInt()
         }
         exceptionData.flatMap { it.sourceData }
-            .filter { it.sourceDataType == CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find { it.dictLabel == "作业" }?.dictValue?.toInt() }
-            .forEach {
-                jobTicketDao.updateJobTicketExceptionData(
-                    it.sourceDataId,
-                    JobTicketStatusEnum.FINISHED.status,
-                    CommonDictDataEnum.EXCEPTION_STATUS.commonDictRes.find { it.dictLabel == "已处理" }?.dictValue?.toInt()
-                )
+            .forEach { exceptionSource ->
+                when (exceptionSource.sourceDataType) {
+                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find { it.dictLabel == "钥匙" }?.dictValue?.toInt() -> {
+                        val keyInfo = hardwareDao.getKeyInfoById(exceptionSource.sourceDataId)
+                        keyInfo?.exStatus = null
+                        keyInfo?.remark = null
+                        keyInfo?.let {
+                            hardwareDao.updateKeyInfo(it)
+                        }
+                    }
+
+                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find { it.dictLabel == "挂锁" }?.dictValue?.toInt() -> {
+                        val lockInfo =
+                            hardwareDao.getLockInfoById(exceptionSource.sourceDataId)
+                        lockInfo?.exStatus = null
+                        lockInfo?.remark = null
+                        lockInfo?.let {
+                            hardwareDao.updateLockInfo(it)
+                        }
+                    }
+
+                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find { it.dictLabel == "仓位" }?.dictValue?.toInt() -> {
+                        val slotsInfo =
+                            hardwareDao.getIsLockCabinetSlotBySlotId(exceptionSource.sourceDataId)
+                        slotsInfo?.status = null
+                        slotsInfo?.remark = null
+                        slotsInfo?.let {
+                            hardwareDao.updateSlotsInfo(it)
+                        }
+                    }
+
+                    CommonDictDataEnum.EXCEPTION_SOURCE_TYPE.commonDictRes.find { it.dictLabel == "作业" }?.dictValue?.toInt() -> {
+                        jobTicketDao.updateJobTicketExceptionData(
+                            exceptionSource.sourceDataId,
+                            JobTicketStatusEnum.FINISHED.status,
+                            CommonDictDataEnum.EXCEPTION_STATUS.commonDictRes.find { it.dictLabel == "已处理" }?.dictValue?.toInt()
+                        )
+                    }
+                }
             }
         val isExceptionData =
             BeanUtils.copyList(exceptionData, IsExceptionStandard::class.java)?.filterNotNull()