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 删除临时用户人脸 */