Ver Fonte

fix(作业执行)
- 修复作业执行时,点位状态判断错误导致无法进行下一步的问题
- 修复作业执行时,获取钥匙数据时,钥匙nfc丢失导致后续逻辑无法执行的问题
- 修复批量更新点位状态时,数据源未过滤已操作点位,导致重复操作的问题
- 修复强制还钥匙时,因耗时操作未在子线程执行,导致ANR的问题

refactor(作业执行)
- 优化批量更新点位状态逻辑,增加票号和分组ID参数
- 移除JobExecuteViewModel中未使用的groupInfoMap属性

refactor(硬件管理)
- 优化取锁逻辑,过滤已绑定点位的挂锁数据
- 优化获取工卡数据逻辑,通过用户ID关联查询工卡和用户信息

refactor(蓝牙业务)
- 优化钥匙归还逻辑,确保钥匙上报成功后再进行下一步操作
- 优化点位钥匙绑定上报逻辑,增加票号和分组ID参数
- 优化下发任务数据组装逻辑,过滤已操作点位

周文健 há 3 meses atrás
pai
commit
f4afaa48c9

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

@@ -300,7 +300,8 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                         workflowStep?.stepTitleShort.toString()
                     ).toString(), onConfirmClick = {
                         item.stepStatus = "1"
-                        item.updateTime = TimeUtils.nowString(TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT)
+                        item.updateTime =
+                            TimeUtils.nowString(TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT)
                         viewModel.updateStepStatus(item).observe(this@JobExecuteFragment) {
                             if (it == false) {
                                 PopTip.build().tip(R.string.step_confirm_failed)
@@ -588,10 +589,10 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
             val currentWorkflowStep = viewModel.currentStepData
             if (currentWorkflowStep?.enableLock == true) {
                 logger.info("当前步骤上锁:${it.value.all { it.pointStatus == "0" }}")
-                it.value.all { it.pointStatus == "0" }
+                it.value.any { it.pointStatus == "0" }
             } else if (currentWorkflowStep?.enableUnlock == true) {
                 logger.info("当前步骤解锁:${it.value.all { it.pointStatus == "1" }}")
-                it.value.all { it.pointStatus == "1" }
+                it.value.any { it.pointStatus == "1" }
             } else {
                 false
             }
@@ -702,7 +703,8 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                     (viewModel.ticketData?.createBy == MainDomainData.userInfo?.userName || workflowStep.currentUserCanConfirm())
                 ) {
                     viewModel.currentStepData?.stepStatus = "1"
-                    viewModel.currentStepData?.updateTime = TimeUtils.nowString(TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT)
+                    viewModel.currentStepData?.updateTime =
+                        TimeUtils.nowString(TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT)
                     viewModel.currentStepData?.let {
                         viewModel.updateStepStatus(it).observe(this@JobExecuteFragment) {
                             if (it == false) {
@@ -722,7 +724,8 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                             it.stepIndex >= workflowStep.gotoStepAfterAddingColocker!!
                         }.sortedByDescending { it.stepIndex }.forEach {
                             it.stepStatus = "0"
-                            it.updateTime = TimeUtils.nowString(TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT)
+                            it.updateTime =
+                                TimeUtils.nowString(TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT)
                             viewModel.updateStepStatusBack(it).observe(this@JobExecuteFragment) {
                                 if (it == false) {
                                     PopTip.build().tip(R.string.step_confirm_failed)

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

@@ -66,7 +66,6 @@ class JobExecuteViewModel @Inject constructor(
     lateinit var ticketUser: List<IsJobTicketUserDataVo>
     var ticketUserMap: MutableMap<Long, List<IsJobTicketUserDataVo>?> = mutableMapOf()
     var groupInfo: MutableList<JobTicketGroupInfoVo> = mutableListOf()
-    var groupInfoMap: MutableMap<Long, MutableList<JobTicketGroupInfoVo>?> = mutableMapOf()
 
     var selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>> = mutableListOf()
     var selecteColockerData: List<JobUserVo> = mutableListOf()

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

@@ -353,7 +353,7 @@ interface HardwareDao {
     /**
      * 根据用户id获取工卡数据
      */
-    @Query("select * from is_job_card where user_id = :userId")
+    @Query("select * from is_job_card ijc left join sys_user su on ijc.user_name = su.user_name where su.user_id = :userId")
     fun getIsJobCardByUserId(userId: Long): MutableList<IsJobCard>
 
     /**

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

@@ -209,6 +209,8 @@ interface IJobTicketRepository {
      */
     fun updateLockPointBatch(
         lockPointsUpdateReq: List<LockPointUpdateReq>,
+        ticketId: Long?,
+        groupId: Long,
         callback: (Boolean, String, Int) -> Unit
     )
 

+ 2 - 0
data/src/main/java/com/grkj/data/repository/impl/network/NetworkJobTicketRepository.kt

@@ -190,6 +190,8 @@ class NetworkJobTicketRepository @Inject constructor() : BaseRepository(), IJobT
 
     override fun updateLockPointBatch(
         lockPointsUpdateReq: List<LockPointUpdateReq>,
+        ticketId: Long?,
+        groupId: Long,
         callback: (Boolean, String, Int) -> Unit
     ) {
         TODO("Not yet implemented")

+ 4 - 2
data/src/main/java/com/grkj/data/repository/impl/standard/HardwareRepository.kt

@@ -131,8 +131,10 @@ class HardwareRepository @Inject constructor(
     ) {
         synchronized(updateLock) {
             lockTakeList.forEach { lockTakeInfo ->
-                lockTakeInfo.ticketId?.let {ticketId->
+                lockTakeInfo.ticketId?.let { ticketId ->
+                    val isJobTicketPoints = jobTicketDao.getJobTicketPointsDataByTicketId(ticketId)
                     val isJobTicketLock = jobTicketDao.getJobTicketLockDataByTicketId(ticketId)
+                        .filter { it.lockId !in isJobTicketPoints.mapNotNull { it.lockId } }
                     logger.debug("作业票挂锁信息:${isJobTicketLock.toJson()}-${MainDomainData.deviceTakeTicketGroupBound[ticketId]}")
                     val emptyTicketLockInfo =
                         isJobTicketLock.first { it.groupId == MainDomainData.deviceTakeTicketGroupBound[ticketId] }
@@ -432,7 +434,7 @@ class HardwareRepository @Inject constructor(
         } else {
             logger.info("没有检测到工卡,重新创建工卡")
             jobCardData = IsJobCard()
-            var defaultCardCodeSize = hardwareDao.getDefaultCardNameCount()
+            val defaultCardCodeSize = hardwareDao.getDefaultCardNameCount()
             jobCardData.cardCode = "CARD_${defaultCardCodeSize + 1}"
             jobCardData.userId = userId
             jobCardData.cardNfc = rfidNo

+ 56 - 52
data/src/main/java/com/grkj/data/repository/impl/standard/JobTicketRepository.kt

@@ -1028,65 +1028,70 @@ class JobTicketRepository @Inject constructor(
     }
 
     override fun updateLockPointBatch(
-        lockPointsUpdateReq: List<LockPointUpdateReq>, callback: (Boolean, String, Int) -> Unit
+        lockPointsUpdateReq: List<LockPointUpdateReq>,
+        ticketId: Long?,
+        groupId: Long,
+        callback: (Boolean, String, Int) -> Unit
     ) {
         var checkResult = ""
-        lockPointsUpdateReq.firstOrNull()?.ticketId?.toLong()?.let { ticketId ->
+        ticketId?.let { ticketId ->
             val isTicketPoints = jobTicketDao.getJobTicketPointsDataByTicketId(ticketId)
-            for (updateReq in lockPointsUpdateReq) {
-                if (updateReq.keyNfc == null) {
-                    callback(false, "钥匙nfc丢失", 500)
-                    return
-                }
-                if (updateReq.lockNfc == null) {
-                    callback(false, "挂锁nfc丢失", 500)
-                    return
-                }
-                val keyData = hardwareDao.getKeyDataByKeyRfid(updateReq.keyNfc)
-                if (keyData == null) {
-                    callback(false, "钥匙信息丢失", 500)
-                    return
-                }
-                val lockData = hardwareDao.getLockDataByLockRfid(updateReq.lockNfc)
-                if (lockData == null) {
-                    callback(false, "挂锁信息丢失", 500)
-                    return
+            if (lockPointsUpdateReq.isNotEmpty()) {
+                for (updateReq in lockPointsUpdateReq) {
+                    if (updateReq.keyNfc == null) {
+                        callback(false, "钥匙nfc丢失", 500)
+                        return
+                    }
+                    if (updateReq.lockNfc == null) {
+                        callback(false, "挂锁nfc丢失", 500)
+                        return
+                    }
+                    val keyData = hardwareDao.getKeyDataByKeyRfid(updateReq.keyNfc)
+                    if (keyData == null) {
+                        callback(false, "钥匙信息丢失", 500)
+                        return
+                    }
+                    val lockData = hardwareDao.getLockDataByLockRfid(updateReq.lockNfc)
+                    if (lockData == null) {
+                        callback(false, "挂锁信息丢失", 500)
+                        return
+                    }
+                    val pointId = hardwareDao.getPointIdByPointNfc(updateReq.pointNfc)
+                    val isTicketPoint = isTicketPoints.firstOrNull { it.pointId == pointId }
+                    if (isTicketPoint == null) {
+                        callback(false, "隔离点信息丢失", 500)
+                        return
+                    }
+                    isTicketPoint.lockId = lockData.lockId
+                    if (updateReq.target == 0) {
+                        checkResult = ICheckDataMode.getCheckDataMode()
+                            .checkUpdatePointData(updateReq, isTicketPoints)
+                        if (checkResult.isNotEmpty()) {
+                            break
+                        }
+                        isTicketPoint.lockedByKeyId = keyData.keyId
+                        isTicketPoint.pointStatus = "1"
+                        isTicketPoint.lockTime =
+                            TimeUtils.nowString(TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT)
+                    } else {
+                        isTicketPoint.unlockedByKeyId = keyData.keyId
+                        isTicketPoint.pointStatus = "2"
+                        isTicketPoint.unlockTime =
+                            TimeUtils.nowString(TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT)
+                    }
                 }
-                val pointId = hardwareDao.getPointIdByPointNfc(updateReq.pointNfc)
-                val isTicketPoint = isTicketPoints.firstOrNull { it.pointId == pointId }
-                if (isTicketPoint == null) {
-                    callback(false, "隔离点信息丢失", 500)
+                if (checkResult.isNotEmpty()) {
+                    callback(false, checkResult, 500)
                     return
                 }
-                isTicketPoint.lockId = lockData.lockId
-                if (updateReq.target == 0) {
-                    checkResult = ICheckDataMode.getCheckDataMode()
-                        .checkUpdatePointData(updateReq, isTicketPoints)
-                    if (checkResult.isNotEmpty()) {
-                        break
-                    }
-                    isTicketPoint.lockedByKeyId = keyData.keyId
-                    isTicketPoint.pointStatus = "1"
-                    isTicketPoint.lockTime =
-                        TimeUtils.nowString(TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT)
-                } else {
-                    isTicketPoint.unlockedByKeyId = keyData.keyId
-                    isTicketPoint.pointStatus = "2"
-                    isTicketPoint.unlockTime =
-                        TimeUtils.nowString(TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT)
+                val isJobTicketPoints = mutableListOf<IsJobTicketPoints>()
+                isTicketPoints.forEach {
+                    val isJobTicketPoint = IsJobTicketPoints()
+                    BeanUtils.copyData(it, isJobTicketPoint)
+                    isJobTicketPoints.add(isJobTicketPoint)
                 }
+                jobTicketDao.updateJobTicketPointData(isJobTicketPoints)
             }
-            if (checkResult.isNotEmpty()) {
-                callback(false, checkResult, 500)
-                return
-            }
-            val isJobTicketPoints = mutableListOf<IsJobTicketPoints>()
-            isTicketPoints.forEach {
-                val isJobTicketPoint = IsJobTicketPoints()
-                BeanUtils.copyData(it, isJobTicketPoint)
-                isJobTicketPoints.add(isJobTicketPoint)
-            }
-            jobTicketDao.updateJobTicketPointData(isJobTicketPoints)
             callback(true, "", 200)
         } ?: callback(false, "作业票不存在", 500)
     }
@@ -1119,7 +1124,6 @@ class JobTicketRepository @Inject constructor(
         isJobTicketKey.ticketId = ticketId
         isJobTicketKey.keyId = keyId
         isJobTicketKey.groupId = MainDomainData.deviceTakeTicketGroupBound[ticketId]
-        val workflowSteps = workflowStepDao.getStepsByMode(jobTicketData.modeId!!)
         val ticketSteps = jobTicketDao.getJobTicketStepDataByTicketId(ticketId)
         val currentStep = ticketSteps.firstOrNull { it.stepStatus == "0" }
         if (currentStep?.enableLock == true) {

+ 44 - 32
ui-base/src/main/java/com/grkj/ui_base/business/BleBusinessManager.kt

@@ -379,7 +379,10 @@ object BleBusinessManager {
                                             true,
                                             currentModeEvent.bleBean.bleDevice.mac,
                                             ticketDetail,
-                                            ticketDetail.ticketLockVOList?.filter { it.lockStatus != "2" && it.groupId == MainDomainData.deviceTakeTicketGroupBound[itBO.ticketId] }
+                                            ticketDetail.ticketLockVOList?.filter {
+                                                it.groupId == MainDomainData.deviceTakeTicketGroupBound[itBO.ticketId] && ticketDetail.ticketPointsVOList?.mapNotNull { it.lockId }
+                                                    ?.contains(it.lockId) != true
+                                            }
                                                 ?.map { it.lockNfc }?.toMutableList(),
                                             true
                                         )
@@ -528,12 +531,14 @@ object BleBusinessManager {
                         TipDialog.show(
                             msg = CommonUtils.getStr(R.string.lock_key_return_tip)!!,
                             onConfirmClick = {
-                                handleKeyReturn(
-                                    bleDevice,
-                                    workTicketGet,
-                                    finishedStatus.second,
-                                    forceReturn = true
-                                )
+                                ThreadUtils.runOnIO {
+                                    handleKeyReturn(
+                                        bleDevice,
+                                        workTicketGet,
+                                        finishedStatus.second,
+                                        forceReturn = true
+                                    )
+                                }
                             },
                             onCancelClick = {
                                 PopTip.build().tip(CommonUtils.getStr(R.string.continue_the_ticket))
@@ -600,7 +605,7 @@ object BleBusinessManager {
                 var currentWorkflowStep = ticketStepDataVo
                 val ticketPoints =
                     RepositoryManager.jobTicketRepo.getTicketDetail(jobTicketData.ticketId)?.ticketPointsVOList
-                if (currentWorkflowStep?.enableReleaseColock == true && currentWorkflowStep.enableUnlock == true ||
+                if (currentWorkflowStep?.enableReleaseColock == true && currentWorkflowStep.enableUnlock ||
                     ticketPoints?.all { it.pointStatus == ticketPoints.firstOrNull()?.pointStatus } == false
                 ) {
                     logger.info("当前解锁和解除共锁在同一步骤或者没有全部点位解锁,不更新步骤状态")
@@ -670,14 +675,20 @@ object BleBusinessManager {
                 }
 
                 LoadingEvent.sendLoadingEvent()
-                // 上报点位钥匙绑定
-                RepositoryManager.jobTicketRepo.updateLockPointBatch(updateList) { isSuccess, msg, code ->
-                    val pointId =
-                        RepositoryManager.hardwareRepo.getPointIdByPointNfc(updateList.first().pointNfc)
-                    val groupId = RepositoryManager.jobTicketRepo.getGroupIdByPointIdAndTicketId(
+                val ticketId = data.taskCode?.toLong()
+                val pointId =
+                    RepositoryManager.hardwareRepo.getPointIdByPointNfc(data.dataList?.first()?.equipRfidNo)
+                val groupId =
+                    RepositoryManager.jobTicketRepo.getGroupIdByPointIdAndTicketId(
                         pointId,
                         data.taskCode?.toLong()!!
                     )
+                // 上报点位钥匙绑定
+                RepositoryManager.jobTicketRepo.updateLockPointBatch(
+                    updateList,
+                    ticketId,
+                    groupId
+                ) { isSuccess, msg, code ->
                     logger.info("还锁操作:${isSuccess},${msg},${code}")
                     if (isSuccess) {
                         // 上报钥匙归还
@@ -986,27 +997,28 @@ object BleBusinessManager {
             taskCode = vo.ticketId.toString(), codeId = 1
         )
         val taskList = ArrayList<WorkTicketSend.DataBO.DataListBO>()
-        vo.ticketPointsVOList?.filter { it.groupId == groupId }?.let { itList ->
-            itList.forEach { pointVO ->
-                if (vo.noUnlockTicketPointsVOSet?.any { it.pointId == pointVO.pointId } == true) {
-                    return@forEach
-                }
-                val task = WorkTicketSend.DataBO.DataListBO(
-                    dataId = pointVO.pointId?.toInt(),
-                    equipRfidNo = pointVO.pointNfc,
-                    equipName = pointVO.pointName,
-                    target = if (isLock) 0 else 1
-                )
-                if (!isLock) {
-                    task.infoRfidNo = pointVO.lockNfc
-                }
-                pointVO.prePointId?.let {
-                    task.prevId = it.toInt()
+        vo.ticketPointsVOList?.filter { it.groupId == groupId && it.pointStatus == if (isLock) "0" else "1" }
+            ?.let { itList ->
+                itList.forEach { pointVO ->
+                    if (vo.noUnlockTicketPointsVOSet?.any { it.pointId == pointVO.pointId } == true) {
+                        return@forEach
+                    }
+                    val task = WorkTicketSend.DataBO.DataListBO(
+                        dataId = pointVO.pointId?.toInt(),
+                        equipRfidNo = pointVO.pointNfc,
+                        equipName = pointVO.pointName,
+                        target = if (isLock) 0 else 1
+                    )
+                    if (!isLock) {
+                        task.infoRfidNo = pointVO.lockNfc
+                    }
+                    pointVO.prePointId?.let {
+                        task.prevId = it.toInt()
+                    }
+                    // TODO partCode待补充
+                    taskList.add(task)
                 }
-                // TODO partCode待补充
-                taskList.add(task)
             }
-        }
         dataBO.dataList = taskList
         bo.data = mutableListOf(dataBO)
         if (isLock) {