From fc04db9268d8f333c078c2abc54cbe25719b5e66 Mon Sep 17 00:00:00 2001 From: lvmeng <848755140@qq.com> Date: Wed, 31 Dec 2025 11:54:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E9=87=8F=E4=BA=BA=E8=84=B8=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sw/dualscreen/activity/MainActivity.kt | 61 ++++++++----------- .../model/response/UserFaceModel.kt | 2 +- .../socket/LanServerListenerImpl.kt | 3 +- .../socket/TcpClientListenerImpl.kt | 3 +- .../sw/dualscreen/viewmodel/UserViewModel.kt | 35 ++++++++--- 5 files changed, 57 insertions(+), 47 deletions(-) diff --git a/app/src/main/java/com/sw/dualscreen/activity/MainActivity.kt b/app/src/main/java/com/sw/dualscreen/activity/MainActivity.kt index 86e8561..0c5ea64 100644 --- a/app/src/main/java/com/sw/dualscreen/activity/MainActivity.kt +++ b/app/src/main/java/com/sw/dualscreen/activity/MainActivity.kt @@ -41,7 +41,6 @@ import com.sw.dualscreen.objbox.FoodModule import com.sw.dualscreen.objbox.FoodModule.IdNameScore import com.sw.dualscreen.presentation.MainScreenPresentation import com.sw.dualscreen.sdk.SensorScaleUtils -import com.sw.dualscreen.socket.LanServer import com.sw.dualscreen.socket.TcpClient import com.sw.dualscreen.utils.BitmapSaver import com.sw.dualscreen.utils.Debouncer @@ -53,8 +52,6 @@ import com.sw.dualscreen.utils.SpTool import com.sw.dualscreen.view.CustomBottomSheetDialog import com.sw.dualscreen.viewmodel.BaseViewModel import com.sw.dualscreen.viewmodel.UserViewModel -import com.sw.face.collect.view.LanServerListenerImpl -import com.sw.face.collect.view.TcpClientListenerImpl import com.sw.plate.utils.Base64 import com.sw.plate.utils.LightManager import com.sw.plate.utils.ToastUtils @@ -73,7 +70,6 @@ import java.time.format.DateTimeFormatter import java.util.Locale import java.util.concurrent.Executors import kotlin.math.roundToInt -import kotlin.text.compareTo /** * 服务员显示界面 @@ -278,16 +274,17 @@ class MainActivity : BaseActivity() { binding.tvFoodName.text = foodInfo.foodName binding.previewView.gone() binding.ivImg.visible() - if (foodInfo.foodImg.isNullOrBlank()) { - takePhoto(successCallback = { imgUri -> - binding.ivImg.load(imgUri) - presentation?.updateFood(foodInfo.copy(foodImg = imgUri.toString())) - }, failureCallback = { - - }) - } else { - binding.ivImg.load(foodInfo.foodImg) - } +// if (foodInfo.foodImg.isNullOrBlank()) { +// takePhoto(successCallback = { imgUri -> +// binding.ivImg.load(imgUri) +// presentation?.updateFood(foodInfo.copy(foodImg = imgUri.toString())) +// }, failureCallback = { +// +// }) +// } else { +// binding.ivImg.load(foodInfo.foodImg) +// } + binding.ivImg.load(foodInfo.foodImg) //pauseAnalysis() } @@ -352,7 +349,8 @@ class MainActivity : BaseActivity() { fun recognizeFood() { startTime = System.currentTimeMillis() - LightManager.openRedLight() +// LightManager.openRedLight() + LightManager.closeRedLight() LightManager.openGreenLight() showWaitingDialog("识别中,请稍后……") takePhoto(successCallback = { photoUri -> @@ -414,13 +412,15 @@ class MainActivity : BaseActivity() { } }, failureCallback = { - runOnUiThread { - hideWaitingDialog() - ToastUtils.showToast("拍照异常,请手动放置后重新识别") - } -// binding.root.postDelayed({ -// recognizeFood() -// }, 500) + hideWaitingDialog() +// ToastUtils.showToast("拍照异常,请手动放置后重新识别") + + shutdownCamera() + setupCamera() + + binding.root.postDelayed({ + recognizeFood() + }, 500) }) } @@ -604,13 +604,10 @@ class MainActivity : BaseActivity() { executor, object : ImageCapture.OnImageSavedCallback { override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) { - runOnUiThread { - val savedUri = outputFileResults.savedUri - Timber.d("takePhoto savedUri = $savedUri") -// ToastUtils.showToast("照片保存成功: $savedUri") - if (savedUri != null) { - successCallback(savedUri) - } + val savedUri = outputFileResults.savedUri + Timber.d("takePhoto savedUri = $savedUri") + if (savedUri != null) { + successCallback(savedUri) } // 恢复图像分析 isAnalyzing = true @@ -619,9 +616,7 @@ class MainActivity : BaseActivity() { override fun onError(exception: ImageCaptureException) { Timber.e("拍照失败: ${exception.message}") failureCallback() - //runOnUiThread { - // ToastUtils.showToast("拍照失败: ${exception.message}") - //} + ToastUtils.showToast("拍照失败: ${exception.message}") // 恢复图像分析 isAnalyzing = true } @@ -952,14 +947,12 @@ class MainActivity : BaseActivity() { timestamp = timestamp, onAllQueryFinished = { taskPageNo = 1 - SpTool.setLastFaceTimestamp(System.currentTimeMillis()) }, onPageQueryFinished = { list -> runOnUiThread { if (list.isEmpty()) { return@runOnUiThread } - SpTool.setLastFaceTimestamp(System.currentTimeMillis()) updateFaceData(list) } } diff --git a/app/src/main/java/com/sw/dualscreen/model/response/UserFaceModel.kt b/app/src/main/java/com/sw/dualscreen/model/response/UserFaceModel.kt index 2fd3524..6c4d5a8 100644 --- a/app/src/main/java/com/sw/dualscreen/model/response/UserFaceModel.kt +++ b/app/src/main/java/com/sw/dualscreen/model/response/UserFaceModel.kt @@ -21,7 +21,7 @@ data class UserFaceModel( // @SerializedName("userId") val userId: String? = "", val faceFeatureStr: String? = "", - + val faceUpdateTimestamp:Long?=null, val faceDeleted: Boolean? = false ) : Parcelable diff --git a/app/src/main/java/com/sw/dualscreen/socket/LanServerListenerImpl.kt b/app/src/main/java/com/sw/dualscreen/socket/LanServerListenerImpl.kt index 9664645..6ca4623 100644 --- a/app/src/main/java/com/sw/dualscreen/socket/LanServerListenerImpl.kt +++ b/app/src/main/java/com/sw/dualscreen/socket/LanServerListenerImpl.kt @@ -1,7 +1,6 @@ -package com.sw.face.collect.view +package com.sw.dualscreen.socket import android.util.Log -import com.sw.dualscreen.socket.LanCommunicationManager import org.json.JSONObject open class LanServerListenerImpl: LanCommunicationManager.Listener { diff --git a/app/src/main/java/com/sw/dualscreen/socket/TcpClientListenerImpl.kt b/app/src/main/java/com/sw/dualscreen/socket/TcpClientListenerImpl.kt index 5dd3519..5622961 100644 --- a/app/src/main/java/com/sw/dualscreen/socket/TcpClientListenerImpl.kt +++ b/app/src/main/java/com/sw/dualscreen/socket/TcpClientListenerImpl.kt @@ -1,7 +1,6 @@ -package com.sw.face.collect.view +package com.sw.dualscreen.socket import android.util.Log -import com.sw.dualscreen.socket.TcpClient import org.json.JSONObject import java.lang.Exception diff --git a/app/src/main/java/com/sw/dualscreen/viewmodel/UserViewModel.kt b/app/src/main/java/com/sw/dualscreen/viewmodel/UserViewModel.kt index cea4a54..e8e23be 100644 --- a/app/src/main/java/com/sw/dualscreen/viewmodel/UserViewModel.kt +++ b/app/src/main/java/com/sw/dualscreen/viewmodel/UserViewModel.kt @@ -64,6 +64,8 @@ class UserViewModel : BaseViewModel() { private val _identifiedFoodInfoList2 = MutableStateFlow>(emptyList()) val identifiedFoodInfoList2: StateFlow> = _identifiedFoodInfoList2 + private var lastFaceTimestamp = 0L + /** * 获取token */ @@ -90,14 +92,15 @@ class UserViewModel : BaseViewModel() { Timber.tag(TAG).d("getUserFaceCache index = $currentPageNo") launch { _loadFaceResult.value = false + //获取全量数据时,时间戳改为0 + SpTool.setLastFaceTimestamp(0) val response = repository.getUserFaceCache(currentPageNo) if (parseResponse(response)) { // 获取成功一次后缓存状态 SPUtil.getInstance().put(GlobalKey.KEY_FIRST_RUN, true) withContext(Dispatchers.Default) { val list: List = response.data ?: emptyList() - if (list.isEmpty()) { - SpTool.setLastFaceTimestamp(System.currentTimeMillis()) + if (pageNo == 1 && list.isEmpty()) { ToastUtils.showToast("查询人脸数据为空") return@withContext } @@ -108,12 +111,18 @@ class UserViewModel : BaseViewModel() { } faceApi.updateFaceData(currentPageNo, faceEntity) if (list.size >= pageSize) { + lastFaceTimestamp = list.last().faceUpdateTimestamp ?: 0L currentPageNo++ getUserFaceCache(currentPageNo) - } else { - SpTool.setLastFaceTimestamp(System.currentTimeMillis()) - _loadFaceResult.value = true + return@withContext } + //查询完成所有数据,保存时间戳 + if (list.isNotEmpty()) { + //非空最后一条数据的是时间戳,空使用上次list最后一条时间戳 + lastFaceTimestamp = list.last().faceUpdateTimestamp ?: 0L + } + SpTool.setLastFaceTimestamp(lastFaceTimestamp) + _loadFaceResult.value = true } // val nextPageIndex = response.result?.nextPageIndex ?: -1 @@ -157,7 +166,7 @@ class UserViewModel : BaseViewModel() { pageNo: Int = 1, pageSize: Int = PAGE_SIZE, timestamp: Long, - onAllQueryFinished:()->Unit, + onAllQueryFinished: () -> Unit, onPageQueryFinished: (List) -> Unit ) { Timber.tag(TAG).d("getFaceIncrementList") @@ -170,8 +179,12 @@ class UserViewModel : BaseViewModel() { if (parseResponse(response)) { withContext(Dispatchers.Default) { val list: List = response.data ?: emptyList() + if (pageNo == 1 && list.isEmpty()) { + return@withContext + } onPageQueryFinished(list) if (list.size >= pageSize) { + lastFaceTimestamp = list.last().faceUpdateTimestamp ?: 0L getFaceIncrementList( pageNo = pageNo + 1, pageSize = pageSize, @@ -179,9 +192,15 @@ class UserViewModel : BaseViewModel() { onAllQueryFinished = onAllQueryFinished, onPageQueryFinished = onPageQueryFinished ) - } else { - onAllQueryFinished() + return@withContext } + //查询完成所有数据,保存时间戳 + if (list.isNotEmpty()) { + //非空实现最后一条数据的是时间戳,空使用上次list最后一条时间戳 + lastFaceTimestamp = list.last().faceUpdateTimestamp ?: 0L + } + SpTool.setLastFaceTimestamp(lastFaceTimestamp) + onAllQueryFinished() } } }