diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9ce4fef..ee6df36 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -30,6 +30,16 @@ android:usesCleartextTraffic="true" android:theme="@style/Theme.FaceCollect"> + + + + + + + (), ViewTreeObserver.OnGlo private val mainViewModel by viewModels() private var currentUserId: String? = null + private var lastFaceTrackId = -1 override fun inflateViewBinding() = ActivityMainBinding.inflate(layoutInflater) @@ -102,7 +103,7 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo super.initialize() mainViewModel.getUserFaceCache(pageNo = pageNo) FaceEngineUtils.activeEngine() - setupArcCamera() + binding.btnCollectFace.setOnClickListener { requestSinglePermissionResult(Manifest.permission.CAMERA) { granted -> if (granted.not()) { @@ -121,7 +122,7 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo binding.tvFaceTip.visible() binding.layoutState.gone() - resumeCamera() +// resumeCamera() startFaceTask() } @@ -173,6 +174,31 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo it.put("content", faceData) } tcpClient?.send(jsonObject) + + // TODO: 保存采集的人脸数据,暂时生成id,实际id在结算终端生成并发送到各台设备 + saveFaceInfo(faceData) + } + + private fun saveFaceInfo(faceData: String) { + Thread { + try { + val tempId = "${System.currentTimeMillis()}-123456789" + val faceEntity = FaceEntity( + tempId, + null, + Base64.decode(faceData) + ).also { + it.userType = "2" + } + FaceDatabase.getInstance(this).faceDao().insert(faceEntity) + recognizeViewModel.refreshFaceList(); + runOnUiThread { + toast("你的人脸信息已采集") + } + } catch (e: Exception) { + e.printStackTrace() + } + }.start() } private var tcpClient: TcpClient? = null @@ -199,6 +225,22 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo super.onSendFailed(json, e) toast("发送失败${e?.message}") } + + override fun onMessage(json: JSONObject?) { + super.onMessage(json) + + val type = json?.getInt("type") + // 根据服务端消息类型处理删除新增临时用户人脸数据--------------------- + when (type) { + LanServer.TYPE_ADD_FACE_DATA -> { + //采集设备id自己生成,不接收服务端的,在本地只判断是否存在同一人脸数据 + } + LanServer.TYPE_CLEAR_FACE_DATA -> { + clearFaceData() + } + else-> {} + } + } }) tcpClient?.start(); @@ -219,6 +261,11 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo // private var imageBitmap: Bitmap? = null private fun collectFace() { + //toast("currentUserId=$currentUserId") + if (currentUserId != null) { + toast("您已采集过人脸信息") + return + } currentUserId = null userFaceInfo = null recognizeViewModel.updateRegisterStatus(REGISTER_STATUS_READY) @@ -248,10 +295,10 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo private fun getFaceData(block: (String) -> Unit) { runBlocking { job = executor.startIntervalTask(5) { - if (currentUserId != null && currentUserId!!.isNotBlank()) { - toast("您已采集过人脸信息") - return@startIntervalTask - } +// if (currentUserId != null && currentUserId!!.isNotBlank()) { +// toast("您已采集过人脸信息") +// return@startIntervalTask +// } if (userFaceInfo == null) { return@startIntervalTask } @@ -353,13 +400,13 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo TAG, "recognizeUserId observe compareResult = ${compareResult.trackId}, userId = ${compareResult.faceEntity.userName}" ) - val lastFaceTrackId = compareResult.trackId + lastFaceTrackId = compareResult.trackId val faceEntity = compareResult.faceEntity currentUserId = faceEntity.userName -// if (!currentUserId.isNullOrBlank()) { -//// toast("您已采集过人脸信息") -// return@Observer -// } + if (!currentUserId.isNullOrBlank()) { + toast("您已采集过人脸信息") + return@Observer + } // //未识别到,拍摄照片 }) @@ -663,29 +710,19 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo binding.dualCameraFaceRectView.drawRealtimeFaceInfo(rgbDrawInfoList) } -// val listIsEmpty = facePreviewInfoList.isEmpty() -// val listFirstTrackId = if (listIsEmpty.not()) facePreviewInfoList[0].trackId else null -// Log.d(TAG,"listIsEmpty=$listIsEmpty,lastFaceTrackId=$lastFaceTrackId,listFirstTrackId=$listFirstTrackId") -// if (listIsEmpty || (lastFaceTrackId != listFirstTrackId)) { -// if (lastFaceTrackId != -1 && currentUserId != null) { -// mealPickupMode = SPUtil.getInstance().get(GlobalKey.KEY_PICKUP_MODE, 0) ?: 0 -// Timber.tag(com.sw.dualscreen.presentation.MainScreenPresentation.Companion.TAG).i("$lastFaceTrackId 用户离开") -// lastFaceTrackId = -1 -// Timber.tag(com.sw.dualscreen.presentation.MainScreenPresentation.Companion.TAG) -// .d("postUserData userNutritionData是否null: ${userNutrition == null}, currentFood是否null: ${currentFood == null},currentUserId是否null:${currentUserId == null}") -// if (userNutrition == null || currentFood == null || currentUserId == null) { -// return -// } -// postUserData() -// if (mealPickupMode == 1 || isKeepFaceState) { -// step2FaceRecognizing(currentFood!!) -// isKeepFaceState = false -// } else { -// activity.isAnalyzing = false -// step1FoodRecognizing() -// } -// } -// } + val listIsEmpty = facePreviewInfoList.isEmpty() + val listFirstTrackId = if (listIsEmpty.not()) facePreviewInfoList[0].trackId else null + Log.d( + TAG, + "listIsEmpty=$listIsEmpty,lastFaceTrackId=$lastFaceTrackId,listFirstTrackId=$listFirstTrackId" + ) + if (listIsEmpty || (lastFaceTrackId != listFirstTrackId)) { + if (lastFaceTrackId != -1 && currentUserId != null) { + Log.d(TAG, "$lastFaceTrackId 用户离开") + lastFaceTrackId = -1 + currentUserId = null + } + } } fun switchCamera() { @@ -757,14 +794,10 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo private val intervalExecutor by lazy { IntervalExecutor() } private var faceTaskJob: Job? = null - // private val initialDelay = 5 * 60 * 1000L -// private val dealyMillis = 10 * 60 * 1000L - private val initialDelay = 60 * 1000L - private val dealyMillis = 30 * 1000L private var taskPageNo = 1 fun startFaceTask() { faceTaskJob = - intervalExecutor.startIntervalTaskWithInitialDelay(initialDelay, dealyMillis) { + intervalExecutor.startIntervalTaskWithInitialDelay(60 * 1000L, 30 * 1000L) { val timestamp = SpTool.getLastFaceTimestamp() if (timestamp == 0L) { return@startIntervalTaskWithInitialDelay @@ -774,7 +807,6 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo timestamp = timestamp, onAllQueryFinished = { taskPageNo = 1 - SpTool.setLastFaceTimestamp(System.currentTimeMillis()) }, onPageQueryFinished = { list -> runOnUiThread { @@ -822,4 +854,34 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo }.start() } +// private var dinnerTypeJob: Job? = null +// fun startDinnerTypeTask() { +// dinnerTypeJob = +// intervalExecutor.startIntervalTaskWithInitialDelay(10 * 60 * 1000L, 15 * 60 * 1000L) { +// mainViewModel.getDinnerType { +// +// } +// } +// } + + private fun clearFaceData() { + Thread { + val faceDao = FaceDatabase.getInstance(this).faceDao() + faceDao.deleteTempUserFaceData() + recognizeViewModel.refreshFaceList(); + }.start() + } + + override fun onResume() { + super.onResume() + setupArcCamera() + + resumeCamera() + } + + override fun onPause() { + super.onPause() + pauseCamera() + } + } \ No newline at end of file diff --git a/app/src/main/java/com/sw/face/collect/base/GlobalData.kt b/app/src/main/java/com/sw/face/collect/base/GlobalData.kt index cb82117..7934562 100644 --- a/app/src/main/java/com/sw/face/collect/base/GlobalData.kt +++ b/app/src/main/java/com/sw/face/collect/base/GlobalData.kt @@ -15,7 +15,7 @@ object GlobalData { /** * 具体业务baseurl */ - var appBaseUrl: String = "" + var appBaseUrl: String = "https://dev.yixiong-tech.com:8081" /** * 横排数量 diff --git a/app/src/main/java/com/sw/face/collect/model/UserFaceModel.kt b/app/src/main/java/com/sw/face/collect/model/UserFaceModel.kt index 20626d9..ab21ba9 100644 --- a/app/src/main/java/com/sw/face/collect/model/UserFaceModel.kt +++ b/app/src/main/java/com/sw/face/collect/model/UserFaceModel.kt @@ -20,7 +20,7 @@ data class UserFaceModel( // @SerializedName("userId") val userId: String? = "", val faceFeatureStr: String? = "", - + val faceUpdateTimestamp: Long?=null, val faceDeleted: Boolean? = false ) // : Parcelable @@ -40,4 +40,14 @@ data class FaceData( val current: Int, val pages: Int, val records: List? = null +) + +data class DinnerType( + val id: String? = "", + //餐次 + val dinnerType: String? = "", + //餐次收费模式(0称重,1固定,2不收费) + val chargeType: Int = 0, + //固定收费(元) 仅charge_type = 1 时 + val fixedAmount: Double?=null ) \ No newline at end of file diff --git a/app/src/main/java/com/sw/face/collect/network/ApiClient.kt b/app/src/main/java/com/sw/face/collect/network/ApiClient.kt index 39704cf..1c6e34e 100644 --- a/app/src/main/java/com/sw/face/collect/network/ApiClient.kt +++ b/app/src/main/java/com/sw/face/collect/network/ApiClient.kt @@ -1,8 +1,8 @@ -package com.sw.dualscreen.network +package com.sw.face.collect.network import android.util.Log import com.sw.face.collect.network.api.ApiService -import com.sw.dualscreen.network.interceptor.RequestInterceptor +import com.sw.face.collect.network.interceptor.RequestInterceptor import com.sw.face.collect.MyApp import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor @@ -11,7 +11,8 @@ import retrofit2.converter.gson.GsonConverterFactory import java.util.concurrent.TimeUnit object ApiClient { - private const val BASE_URL = "http://device.shuziweidao.com:8889/" +// private const val BASE_URL = "http://device.shuziweidao.com:8889/" + private const val BASE_URL = "https://dev.yixiong-tech.com:8081" //private const val TIME_OUT = 30L // 超时时间(秒) //todo 临时测试改为5秒 diff --git a/app/src/main/java/com/sw/face/collect/network/api/ApiService.kt b/app/src/main/java/com/sw/face/collect/network/api/ApiService.kt index 5051533..7a3a82a 100644 --- a/app/src/main/java/com/sw/face/collect/network/api/ApiService.kt +++ b/app/src/main/java/com/sw/face/collect/network/api/ApiService.kt @@ -2,6 +2,7 @@ package com.sw.face.collect.network.api import com.sw.face.collect.base.GlobalData import com.sw.face.collect.model.ApiResponse +import com.sw.face.collect.model.DinnerType import com.sw.face.collect.model.UserFaceModel import okhttp3.MultipartBody import okhttp3.RequestBody @@ -33,4 +34,12 @@ interface ApiService { @Url url: String = "${GlobalData.appBaseUrl}/terminal/neglect/common/app/faceFeature/increment/list", @Body param: Map ): ApiResponse?> + + /** + * 获取当前餐点类型 + */ + @GET + suspend fun getDinnerType( + @Url url: String = "${GlobalData.appBaseUrl}/terminal/neglect/common/app/getRegionRule", + ): ApiResponse } \ No newline at end of file diff --git a/app/src/main/java/com/sw/face/collect/network/interceptor/RequestInterceptor.kt b/app/src/main/java/com/sw/face/collect/network/interceptor/RequestInterceptor.kt index f915d87..365f479 100644 --- a/app/src/main/java/com/sw/face/collect/network/interceptor/RequestInterceptor.kt +++ b/app/src/main/java/com/sw/face/collect/network/interceptor/RequestInterceptor.kt @@ -1,9 +1,8 @@ -package com.sw.dualscreen.network.interceptor +package com.sw.face.collect.network.interceptor import android.text.TextUtils -import com.sw.dualscreen.GlobalData -import com.sw.dualscreen.GlobalKey import com.sw.dualscreen.utils.SPUtil +import com.sw.face.collect.base.GlobalData import com.sw.plate.App import okhttp3.Interceptor import okhttp3.Request @@ -30,12 +29,12 @@ class RequestInterceptor : Interceptor { return chain.proceed(newRequest) } - private fun getToken(originRequest: Request): String { - val tokenParam = originRequest.header("X-Access-Token") - if (!TextUtils.isEmpty(tokenParam)) return tokenParam!! - // 从本地获取token的逻辑 - val spUtil = SPUtil.getInstance(context = App.getContext()) - return spUtil.get(GlobalKey.KEY_TOKEN, "") as String -// return "eyJhbGciOiJIUzUxMiJ9.eyJpZCI6MTQ2LCJ1c2VyTmFtZSI6IjEzNjgxNDQ4ODU2IiwibmFtZSI6IuW-kOejiiIsInBhc3N3b3JkIjoiOTllOTQ1ZmVjZmZjNWIzNDI4MmUwNDRlODYyMzdjM2UxZjU5OWY5OCIsInNhbHQiOiI0NmEzMzUzYWU4OTA0MDYxYjMzODU5ZWNlYTBlMGE2NyIsInBob25lIjoiMTM2ODE0NDg4NTYiLCJzdGF0dXMiOjEsInVzZXJUeXBlIjoyLCJjcmVhdGVVc2VyTm8iOiIxNDEiLCJjcmVhdGVUaW1lIjoxNjI2OTQzNDE2MDAwLCJ1cGRhdGVVc2VyTm8iOiIxNDEiLCJ1cGRhdGVUaW1lIjoxNjI2OTQzNDE2MDAwLCJpc0RlbCI6ZmFsc2UsImVhSWQiOjk5LCJlYUlkTGlzdCI6Ijk5IiwiaXNTaG9wTWFuYWdlciI6dHJ1ZSwidXNlck5vIjoiMWY5Nzk5ZWMtODlkYi00MWYyLTk1YTEtY2UzNTA3Y2QyMTU2In0.f7wImPgBOYMV0AqRchnXGPkUWZN9dFJ9gLPsaB8uNldd21IfXLjJl8y-FiWVuVUvlwUvGpgqGDFR1JKj5H7amw" - } +// private fun getToken(originRequest: Request): String { +// val tokenParam = originRequest.header("X-Access-Token") +// if (!TextUtils.isEmpty(tokenParam)) return tokenParam!! +// // 从本地获取token的逻辑 +// val spUtil = SPUtil.getInstance(context = App.getContext()) +// return spUtil.get(GlobalKey.KEY_TOKEN, "") as String +//// return "eyJhbGciOiJIUzUxMiJ9.eyJpZCI6MTQ2LCJ1c2VyTmFtZSI6IjEzNjgxNDQ4ODU2IiwibmFtZSI6IuW-kOejiiIsInBhc3N3b3JkIjoiOTllOTQ1ZmVjZmZjNWIzNDI4MmUwNDRlODYyMzdjM2UxZjU5OWY5OCIsInNhbHQiOiI0NmEzMzUzYWU4OTA0MDYxYjMzODU5ZWNlYTBlMGE2NyIsInBob25lIjoiMTM2ODE0NDg4NTYiLCJzdGF0dXMiOjEsInVzZXJUeXBlIjoyLCJjcmVhdGVVc2VyTm8iOiIxNDEiLCJjcmVhdGVUaW1lIjoxNjI2OTQzNDE2MDAwLCJ1cGRhdGVVc2VyTm8iOiIxNDEiLCJ1cGRhdGVUaW1lIjoxNjI2OTQzNDE2MDAwLCJpc0RlbCI6ZmFsc2UsImVhSWQiOjk5LCJlYUlkTGlzdCI6Ijk5IiwiaXNTaG9wTWFuYWdlciI6dHJ1ZSwidXNlck5vIjoiMWY5Nzk5ZWMtODlkYi00MWYyLTk1YTEtY2UzNTA3Y2QyMTU2In0.f7wImPgBOYMV0AqRchnXGPkUWZN9dFJ9gLPsaB8uNldd21IfXLjJl8y-FiWVuVUvlwUvGpgqGDFR1JKj5H7amw" +// } } \ No newline at end of file diff --git a/app/src/main/java/com/sw/face/collect/receiver/BootReceiver.kt b/app/src/main/java/com/sw/face/collect/receiver/BootReceiver.kt new file mode 100644 index 0000000..996427b --- /dev/null +++ b/app/src/main/java/com/sw/face/collect/receiver/BootReceiver.kt @@ -0,0 +1,19 @@ +package com.sw.face.collect.receiver + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.util.Log +import com.sw.face.collect.MainActivity + +class BootReceiver : BroadcastReceiver() { + + override fun onReceive(context: Context, intent: Intent) { + if (Intent.ACTION_BOOT_COMPLETED == intent.action) { + Log.d("BootReceiver","设备启动完成,开始执行自启动逻辑") + val intent = Intent(context, MainActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + context.startActivity(intent) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sw/face/collect/repository/RemoteRepository.kt b/app/src/main/java/com/sw/face/collect/repository/RemoteRepository.kt index 3cbb40c..e31bd0d 100644 --- a/app/src/main/java/com/sw/face/collect/repository/RemoteRepository.kt +++ b/app/src/main/java/com/sw/face/collect/repository/RemoteRepository.kt @@ -2,6 +2,7 @@ package com.sw.face.collect.repository import com.sw.dualscreen.repository.BaseRepository import com.sw.face.collect.model.ApiResponse +import com.sw.face.collect.model.DinnerType import com.sw.face.collect.model.UserFaceModel import com.sw.face.collect.network.api.ApiService @@ -28,7 +29,7 @@ class RemoteRepository constructor( ) } } - /** + /** * 获取人脸数据 */ suspend fun getFaceIncrementList( @@ -47,4 +48,13 @@ class RemoteRepository constructor( } } + /** + * 获取当前餐点类型 + */ + suspend fun getDinnerType(): ApiResponse { + return safeApiCall { + apiService.getDinnerType() + } + } + } \ No newline at end of file diff --git a/app/src/main/java/com/sw/face/collect/socket/LanServer.java b/app/src/main/java/com/sw/face/collect/socket/LanServer.java index 8d57e1e..453eee4 100644 --- a/app/src/main/java/com/sw/face/collect/socket/LanServer.java +++ b/app/src/main/java/com/sw/face/collect/socket/LanServer.java @@ -1,7 +1,8 @@ package com.sw.face.collect.socket; public class LanServer { - + public static final int TYPE_ADD_FACE_DATA = 1; + public static final int TYPE_CLEAR_FACE_DATA = 2; private static volatile LanCommunicationManager instance; public static LanCommunicationManager getInstance() { @@ -18,4 +19,17 @@ public class LanServer { } return instance; } + + void a() { + //HashMap data = new HashMap<>(); + //data.put("type", LanServer.TYPE_ADD_FACE_DATA); + //data.put("faceId", tempUserId);//收到采集信息,每次生成新的ID + //data.put("faceFeature", faceFeatureString); + //lanServer.broadcast(new JSONObject(data)); +// + //HashMap data = new HashMap<>(); + //data.put("type", LanServer.TYPE_CLEAR_FACE_DATA); + //lanServer.broadcast(new JSONObject(data)); + } + } diff --git a/app/src/main/java/com/sw/face/collect/viewmodel/MainViewModel.kt b/app/src/main/java/com/sw/face/collect/viewmodel/MainViewModel.kt index 9ba51a5..1127e43 100644 --- a/app/src/main/java/com/sw/face/collect/viewmodel/MainViewModel.kt +++ b/app/src/main/java/com/sw/face/collect/viewmodel/MainViewModel.kt @@ -2,10 +2,11 @@ package com.sw.face.collect.viewmodel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sw.dualscreen.network.ApiClient +import com.sw.face.collect.network.ApiClient import com.sw.dualscreen.utils.SPUtil import com.sw.face.collect.base.GlobalKey import com.sw.face.collect.model.ApiResponse +import com.sw.face.collect.model.DinnerType import com.sw.face.collect.model.UserFaceModel import com.sw.face.collect.repository.RemoteRepository import com.sw.face.collect.utils.SpTool @@ -25,6 +26,8 @@ class MainViewModel() : ViewModel() { private val faceApi: FaceApi = FaceApi() protected val repository = RemoteRepository(ApiClient.apiService) + private var lastFaceTimestamp = 0L + protected open fun parseResponse(response: ApiResponse<*>): Boolean { val code = response.code if (code == "00000" || code == "200" || code == "0") { @@ -43,14 +46,15 @@ class MainViewModel() : ViewModel() { var currentPageNo = pageNo // Timber.tag(TAG).d("getUserFaceCache index = $currentPageNo") viewModelScope.launch { + //获取全量数据时,时间戳改为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 } @@ -59,11 +63,17 @@ class MainViewModel() : ViewModel() { } faceApi.updateFaceData(currentPageNo, faceEntity) if (list.size >= pageSize) { + lastFaceTimestamp = list.last().faceUpdateTimestamp ?: 0L currentPageNo++ getUserFaceCache(currentPageNo) - } else { - SpTool.setLastFaceTimestamp(System.currentTimeMillis()) + return@withContext } + //查询完成所有数据,保存时间戳 + if (list.isNotEmpty()) { + //非空最后一条数据的是时间戳,空使用上次list最后一条时间戳 + lastFaceTimestamp = list.last().faceUpdateTimestamp ?: 0L + } + SpTool.setLastFaceTimestamp(lastFaceTimestamp) } } } @@ -76,7 +86,7 @@ class MainViewModel() : ViewModel() { pageNo: Int = 1, pageSize: Int = PAGE_SIZE, timestamp: Long, - onAllQueryFinished:()->Unit, + onAllQueryFinished: () -> Unit, onPageQueryFinished: (List) -> Unit ) { viewModelScope.launch { @@ -89,7 +99,11 @@ class MainViewModel() : ViewModel() { withContext(Dispatchers.Default) { val list: List = response.data ?: emptyList() onPageQueryFinished(list) + if (pageNo == 1 && list.isEmpty()) { + return@withContext + } if (list.size >= pageSize) { + lastFaceTimestamp = list.last().faceUpdateTimestamp ?: 0L getFaceIncrementList( pageNo = pageNo + 1, pageSize = pageSize, @@ -97,8 +111,30 @@ class MainViewModel() : ViewModel() { onAllQueryFinished = onAllQueryFinished, onPageQueryFinished = onPageQueryFinished ) - } else { - onAllQueryFinished() + return@withContext + } + //查询完成所有数据,保存时间戳 + if (list.isNotEmpty()) { + //非空最后一条数据的是时间戳,空使用上次list最后一条时间戳 + lastFaceTimestamp = list.last().faceUpdateTimestamp ?: 0L + } + SpTool.setLastFaceTimestamp(lastFaceTimestamp) + onAllQueryFinished() + } + } + } + } + + /** + * 获取当前餐点类型 + */ + fun getDinnerType(block: (DinnerType) -> Unit) { + viewModelScope.launch { + val response = repository.getDinnerType() + if (parseResponse(response)) { + withContext(Dispatchers.Default) { + response.data?.let { + block(it) } } } 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 4b3a682..bd6fec5 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 @@ -88,4 +88,10 @@ public interface FaceDao { @Query("UPDATE sqlite_sequence SET seq = 0 WHERE name ='face'") void resetId(); + + /** + * @return 删除临时用户人脸 + */ + @Query("DELETE from face WHERE user_type = '2'") + int deleteTempUserFaceData(); }