增加心跳处理人脸数据增减

This commit is contained in:
2025-09-09 15:59:29 +08:00
parent 3b492cb710
commit e9a366b52a
11 changed files with 161 additions and 2 deletions
+2
View File
@@ -93,4 +93,6 @@ dependencies {
implementation(libs.androidx.activity.ktx)
implementation(libs.androidx.fragment.ktx)
// implementation(libs.adapter.coroutines)
implementation("androidx.work:work-runtime-ktx:2.8.1")
}
@@ -31,6 +31,7 @@ import com.sw.platecabinet.R
import com.sw.platecabinet.databinding.ActivityLoginFaceBinding
import com.sw.platecabinet.databinding.ItemTitleTimeBinding
import com.sw.platecabinet.model.response.EquipmentUserInfo
import com.sw.platecabinet.network.task.TaskManager
import com.sw.platecabinet.utils.PermissionHelper
import timber.log.Timber
@@ -79,6 +80,9 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
val intent = Intent(this, LoginByPwdActivity::class.java)
startActivity(intent)
}
// TODO: 测试请求
TaskManager.startTask()
}
private fun checkCameraPermission() {
@@ -16,7 +16,7 @@ object ApiClient {
// private const val BASE_URL = "http://192.168.1.8:9092"
private const val TIME_OUT = 30L // 超时时间(秒)
private val okHttpClient = OkHttpClient.Builder()
val okHttpClient = OkHttpClient.Builder()
.connectTimeout(TIME_OUT, TimeUnit.SECONDS)
.readTimeout(TIME_OUT, TimeUnit.SECONDS)
.writeTimeout(TIME_OUT, TimeUnit.SECONDS)
@@ -63,4 +63,12 @@ interface ApiService {
*/
@POST("/shuwei-zhct/swEquipmentRelUser/findByPlateNumber")
suspend fun findByPlateNumber(@Body param: BindParam): ApiResponse<EquipmentUserInfo>
/**
* 获取人脸增量数据
*
* @param timeDate 时间戳(毫秒级)
*/
@GET("/shuwei-zhct/scales/getHeartbeatInterface")
suspend fun getHeartbeatInterface(@Query("timeDate") timeDate: Long): ApiResponse<List<UserFaceModel>>
}
@@ -0,0 +1,81 @@
package com.sw.platecabinet.network.task
import android.content.Context
import android.util.Log
import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters
import com.arcsoft.face.FaceEngine
import com.sw.inbound.utils.GsonUtils
import com.sw.plate.utils.Base64
import com.sw.plate.utils.arcface.FaceApi
import com.sw.plate.utils.arcface.facedb.entity.FaceEntity
import com.sw.plate.utils.arcface.faceserver.FaceServer
import com.sw.platecabinet.network.ApiClient
import com.sw.platecabinet.repository.RemoteRepository
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
class HeartBeatTask(appContext: Context, workerParams: WorkerParameters) :
CoroutineWorker(appContext, workerParams) {
companion object {
private const val TAG = "HeartBeatTask"
}
override suspend fun doWork(): Result {
return try {
// 执行后台任务逻辑
performSync()
TaskManager.startTask()
Result.success()
} catch (e: Exception) {
e.printStackTrace()
Result.retry()
}
}
private val repository: RemoteRepository by lazy {
RemoteRepository(ApiClient.apiService)
}
private val faceApi: FaceApi = FaceApi()
private suspend fun performSync() {
withContext(Dispatchers.IO) {
val timestamp = System.currentTimeMillis()
// val timestamp = 1757063902000
val resp = repository.getHeartbeatInterface(timestamp)
Log.d(TAG, "performSync: ${GsonUtils.toJson(resp)}")
val list = resp.data
if (list.isNullOrEmpty()) {
return@withContext
}
val faceServer = FaceServer.getInstance()
val faceEngine: FaceEngine? = faceServer.faceEngine
list.forEach {
try {
if (it.faceType == "0") {
if (it.userId.isNullOrBlank().not()) {
//userId非空,根据userId删除人脸数据
faceApi.deleteByUserName(it.userId)
faceEngine?.removeFaceFeature(it.userId.toInt())
}
} else if (it.faceType == "1") {
//新增人脸数据
val featureData = Base64.decode(it.faceFeatureString)
val insertEntity = FaceEntity(it.userId, null, featureData)
val faceId = faceApi.insert(insertEntity)
insertEntity.faceId = faceId
faceServer.registerFaceFeatureInfoFromDb( insertEntity, faceEngine)
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
}
}
@@ -0,0 +1,26 @@
package com.sw.platecabinet.network.task
import androidx.work.ExistingWorkPolicy
import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.WorkManager
import com.sw.plate.App
import java.util.concurrent.TimeUnit
object TaskManager {
private const val TASK_NAME = "SmartPlateCabinetTask"
fun startTask() {
val nextRequest = OneTimeWorkRequestBuilder<HeartBeatTask>()
.setInitialDelay(3, TimeUnit.MINUTES)
// .setInputData(inputData)
.build()
WorkManager.getInstance(App.getContext())
.enqueueUniqueWork(TASK_NAME, ExistingWorkPolicy.REPLACE, nextRequest)
}
fun cancelTask() {
WorkManager.getInstance(App.getContext())
.cancelUniqueWork(TASK_NAME)
}
}
@@ -76,4 +76,13 @@ class RemoteRepository constructor(
suspend fun findByPlateNumber(param: BindParam): ApiResponse<EquipmentUserInfo> {
return safeApiCall { apiService.findByPlateNumber(param) }
}
/**
* 获取人脸增量数据
*
* @param timeDate 时间戳(毫秒级)
*/
suspend fun getHeartbeatInterface(timeDate: Long): ApiResponse<List<UserFaceModel>> {
return safeApiCall { apiService.getHeartbeatInterface(timeDate) }
}
}