From aa96455f662915325e00b5034128782e4b3a28cb Mon Sep 17 00:00:00 2001 From: lvmeng <848755140@qq.com> Date: Wed, 11 Mar 2026 16:02:13 +0800 Subject: [PATCH] =?UTF-8?q?refactor(face):=20=E4=BC=98=E5=8C=96=E4=BA=BA?= =?UTF-8?q?=E8=84=B8=E7=89=B9=E5=BE=81=E5=AD=98=E5=82=A8=E4=B8=8E=E5=A2=9E?= =?UTF-8?q?=E9=87=8F=E5=90=8C=E6=AD=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - FaceDao 新增 queryAllByUserName 查询用户全部特征记录 - 改为查询所有记录后做去重判断,支持同一用户保存多条特征数据 - 将 Thread 替换为 lifecycleScope.launch(Dispatchers.IO) 协程 - 提取 getNewFaceEntity 方法消除重复代码 - 新增特征比对调试日志 Co-Authored-By: Claude Sonnet 4.6 --- .../sw/platecabinet/activity/BaseActivity.kt | 42 +++++++++++-------- .../utils/arcface/facedb/dao/FaceDao.java | 9 ++++ 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/sw/platecabinet/activity/BaseActivity.kt b/app/src/main/java/com/sw/platecabinet/activity/BaseActivity.kt index b0aa8f5..6303a58 100644 --- a/app/src/main/java/com/sw/platecabinet/activity/BaseActivity.kt +++ b/app/src/main/java/com/sw/platecabinet/activity/BaseActivity.kt @@ -14,6 +14,7 @@ import androidx.activity.enableEdgeToEdge import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat +import androidx.lifecycle.lifecycleScope import androidx.viewbinding.ViewBinding import com.google.gson.Gson import com.sw.inbound.utils.DateTimeUtils @@ -468,9 +469,9 @@ abstract class BaseActivity : AppCompatActivity() { public val recognizeViewModel by viewModels() private fun updateFaceData(list: List) { - Thread { + lifecycleScope.launch(Dispatchers.IO) { val faceList = mutableListOf() - val faceDao = FaceDatabase.getInstance(this).faceDao() + val faceDao = FaceDatabase.getInstance(this@BaseActivity).faceDao() try { list.forEach { model -> if (model.faceDeleted == true) { @@ -480,19 +481,14 @@ abstract class BaseActivity : AppCompatActivity() { // FaceEntity("-1", null, byteArrayOf(-1)).also { it.userType = "-1" } // } } else { - val faceData = faceDao.queryByUserName(model.userId) - if (faceData == null) { - //保存数据 - val faceEntity = FaceEntity( - model.userId, - null, - Base64.decode(model.faceFeatureStr) - ).also { - //1-会员、2-临时用户 - it.userType = if (model.member) "1" else "2" - it.cardNo = model.cardNo - } - faceList.add(faceEntity) + // 获取该用户所有已存特征,判断当前特征是否已存在 + val existList = faceDao.queryAllByUserName(model.userId) + val featureMatches = existList.map { Base64.encode(it.featureData) == model.faceFeatureStr } + Timber.d("userId=${model.userId}, 已存记录数=${existList.size}, 各条特征是否与服务器一致=$featureMatches") + val alreadyExists = featureMatches.any { it } + if (!alreadyExists) { + //当前特征不存在,保存 + faceList.add(getNewFaceEntity(model)) } } } @@ -501,13 +497,25 @@ abstract class BaseActivity : AppCompatActivity() { } try { if (faceList.isNotEmpty()) { - FaceDatabase.getInstance(this).faceDao().insert(faceList) + FaceDatabase.getInstance(this@BaseActivity).faceDao().insert(faceList) } recognizeViewModel.refreshFaceList() } catch (e: Exception) { e.printStackTrace() } - }.start() + } + } + + private fun getNewFaceEntity(model: UserFaceModel) : FaceEntity { + return FaceEntity( + model.userId, + null, + Base64.decode(model.faceFeatureStr) + ).also { + //1-会员、2-临时用户 + it.userType = if (model.member) "1" else "2" + it.cardNo = model.cardNo + } } fun initPlateList() { diff --git a/lib_face/src/main/java/com/sw/plate/utils/arcface/facedb/dao/FaceDao.java b/lib_face/src/main/java/com/sw/plate/utils/arcface/facedb/dao/FaceDao.java index e22cb17..34e2b2f 100644 --- a/lib_face/src/main/java/com/sw/plate/utils/arcface/facedb/dao/FaceDao.java +++ b/lib_face/src/main/java/com/sw/plate/utils/arcface/facedb/dao/FaceDao.java @@ -92,6 +92,15 @@ public interface FaceDao { @Query("SELECT * FROM face WHERE user_name = :userName limit 1") FaceEntity queryByUserName(String userName); + /** + * 查询指定用户的所有人脸记录(同一用户可能存有多条特征数据) + * + * @param userName 用户ID + * @return 该用户所有人脸记录列表 + */ + @Query("SELECT * FROM face WHERE user_name = :userName") + List queryAllByUserName(String userName); + /** * @return 删除临时用户人脸 */