餐盘柜优化

This commit is contained in:
mazengfei
2026-01-16 11:53:44 +08:00
parent ab58651733
commit 8337b3fabb
19 changed files with 1099 additions and 110 deletions
@@ -464,7 +464,7 @@ abstract class BaseActivity<VB : ViewBinding> : AppCompatActivity() {
}
}
private val recognizeViewModel by viewModels<RecognizeViewModel>()
public val recognizeViewModel by viewModels<RecognizeViewModel>()
private fun updateFaceData(list: List<UserFaceModel>) {
Thread {
val faceList = mutableListOf<FaceEntity>()
@@ -4,8 +4,10 @@ import android.content.Intent
import android.util.Log
import androidx.activity.viewModels
import com.sw.inbound.utils.DateTimeUtils
import com.sw.plate.App
import com.sw.plate.utils.AppUtil
import com.sw.plate.utils.ToastUtils
import com.sw.plate.utils.arcface.facedb.FaceDatabase
import com.sw.platecabinet.GlobalData
import com.sw.platecabinet.MyApp
import com.sw.platecabinet.databinding.ActivityDeviceInitBinding
@@ -51,6 +53,17 @@ class DeviceInitActivity : BaseActivity<ActivityDeviceInitBinding>() {
// }, 1000)
initPlateList()
showWaitingDialog("加载中……")
Thread {
val faceDao = FaceDatabase.getInstance(App.getContext()).faceDao()
faceDao.deleteAll()
faceDao.resetId()
// runOnUiThread {
// viewModel.getUserFaceCache {
// recognizeViewModel.refreshFaceList()
// }
// }
}.start()
viewModel.getUserFaceCache()
viewModel.getDeviceConfig { deviceConfig ->
runOnUiThread {
if (deviceConfig == null) {
@@ -69,6 +82,7 @@ class DeviceInitActivity : BaseActivity<ActivityDeviceInitBinding>() {
}, 500)
}
}
// goLoginActivity()
}
@@ -95,8 +109,9 @@ class DeviceInitActivity : BaseActivity<ActivityDeviceInitBinding>() {
private fun initPlateList() {
// SpTool.putString(SpTool.PLATE_BOX_DATA, "")
var list = SpTool.getPlateData()
if (list.isNullOrEmpty()) {
// var list = SpTool.getPlateData()
var list:List<EquipmentUserInfo>? = null;
// if (list.isNullOrEmpty()) {
list = mutableListOf()
repeat(22) { index ->
list.add(
@@ -108,7 +123,7 @@ class DeviceInitActivity : BaseActivity<ActivityDeviceInitBinding>() {
)
)
}
}
// }
// TODO: 测试数据----------------------------⬇️
// else {
// list[0].let {
@@ -13,13 +13,12 @@ import android.view.ViewGroup
import android.view.ViewTreeObserver
import androidx.activity.viewModels
import androidx.annotation.RequiresApi
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import androidx.lifecycle.lifecycleScope
import com.arcsoft.face.ErrorInfo
import com.google.gson.Gson
import com.sw.platecabinet.socket.TcpClientListenerImpl
import com.sw.inbound.utils.DateTimeUtils
import com.sw.inbound.utils.GsonUtils
import com.sw.plate.App
import com.sw.plate.utils.Base64
import com.sw.plate.utils.ToastUtils
@@ -40,6 +39,7 @@ import com.sw.plate.utils.arcface.facedb.entity.FaceEntity
import com.sw.plate.utils.arcface.model.UserFaceInfo
import com.sw.plate.utils.arcface.viewmodel.RecognizeViewModel
import com.sw.plate.utils.arcface.viewmodel.RecognizeViewModel.REGISTER_STATUS_READY
import com.sw.platecabinet.GlobalData
import com.sw.platecabinet.MyApp
import com.sw.platecabinet.R
import com.sw.platecabinet.databinding.ActivityLoginFaceBinding
@@ -47,19 +47,21 @@ import com.sw.platecabinet.databinding.ItemTitleTimeBinding
import com.sw.platecabinet.ext.gone
import com.sw.platecabinet.ext.invisible
import com.sw.platecabinet.ext.visible
import com.sw.platecabinet.model.request.BindParam
import com.sw.platecabinet.model.response.EquipmentUserInfo
import com.sw.platecabinet.socket.LanServer
import com.sw.platecabinet.socket.LanServerListenerImpl
import com.sw.platecabinet.socket.TcpClient
import com.sw.platecabinet.utils.IntervalExecutor
import com.sw.platecabinet.utils.PermissionHelper
import com.sw.platecabinet.utils.PlateUtils
import com.sw.platecabinet.utils.SpTool
import com.sw.platecabinet.utils.countDownByFlow
import com.sw.platecabinet.viewmodel.SettingViewModel
import kotlinx.coroutines.Job
import kotlinx.coroutines.runBlocking
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import org.json.JSONObject
import timber.log.Timber
/**
@@ -67,7 +69,7 @@ import timber.log.Timber
*/
class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
ViewTreeObserver.OnGlobalLayoutListener {
private val recognizeViewModel by viewModels<RecognizeViewModel>()
// private val recognizeViewModel by viewModels<RecognizeViewModel>()
private var countDownTimer: CountDownTimer? = null
private val CAMERA_PERMISSION_REQUEST_CODE = 100
@@ -97,6 +99,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
override fun initialize() {
instance = this
viewModel.activeEngine()
addSocketListener()
initCountTime()
initArcViewModel()
@@ -106,15 +109,6 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
//viewModel.generateToken()
// viewModel.activeEngine()
// TODO: 暂时注释人脸接口数据,测试本地采集
// viewModel.getUserFaceCache()
// Thread {
// val faceDao = FaceDatabase.getInstance(App.getContext()).faceDao();
// faceDao.deleteAll()
// faceDao.resetId()
// }.start()
// binding.llToPwd.setOnClickListener {
// val intent = Intent(this, LoginByPwdActivity::class.java)
// startActivity(intent)
@@ -124,7 +118,9 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
EventBus.getDefault().register(this)
binding.btnCollectFace.setOnClickListener { collectFace() }
// binding.btnCollectFace.setOnClickListener { collectFace() }
checkFaceState()
}
private fun checkCameraPermission() {
@@ -310,7 +306,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
EventBus.getDefault().unregister(this)
countDownJob?.cancel()
checkFaceJob?.cancel()
super.onDestroy()
}
@@ -565,7 +561,8 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
return
}
if (currentUserId != null) {
ToastUtils.showToast("您已采集过人脸信息")
currentUserId = null
// ToastUtils.showToast("您已采集过人脸信息")
return
}
currentUserId = null
@@ -574,16 +571,16 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
//showWaitingDialog("人脸信息中……")
// binding.tvFaceTip.gone()
binding.btnCollectFace.invisible()
binding.layoutState.visible()
binding.pbCollectLoading.visible()
binding.tvCollectState.text = "采集中......"
// binding.btnCollectFace.invisible()
// binding.layoutState.visible()
// binding.pbCollectLoading.visible()
// binding.tvCollectState.text = "采集中......"
getFaceData { faceData ->
Log.d("LoginByFaceActivity", "faceData: $faceData")
runOnUiThread {
//hideWaitingDialog()
//toast("人脸信息已采集")
binding.pbCollectLoading.gone()
// binding.pbCollectLoading.gone()
//binding.tvCollectState.text = "采集完成"
userFaceInfo = null
countDown()
@@ -617,23 +614,23 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
val executor = IntervalExecutor()
private var currentUserId: String? = null
private fun countDown() {
countDownJob = countDownByFlow(
total = 3,
scope = lifecycleScope,
onStart = {
binding.tvCollectState.text = "采集完成(3s"
},
onTick = { seconds ->
binding.tvCollectState.text = "采集完成(${seconds}s"
},
onFinish = {
//binding.tvCollectState.text = "采集完成"
currentUserId = null
binding.layoutState.invisible()
// binding.tvFaceTip.visible()
binding.btnCollectFace.visible()
}
)
// countDownJob = countDownByFlow(
// total = 3,
// scope = lifecycleScope,
// onStart = {
// binding.tvCollectState.text = "采集完成(3s"
// },
// onTick = { seconds ->
// binding.tvCollectState.text = "采集完成(${seconds}s"
// },
// onFinish = {
// //binding.tvCollectState.text = "采集完成"
// currentUserId = null
// binding.layoutState.invisible()
//// binding.tvFaceTip.visible()
// binding.btnCollectFace.visible()
// }
// )
}
private fun saveFaceInfo(faceData: String) {
@@ -649,13 +646,91 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
}
FaceDatabase.getInstance(this).faceDao().insert(faceEntity)
recognizeViewModel.refreshFaceList();
runOnUiThread {
ToastUtils.showToast("你的人脸信息已采集")
}
// runOnUiThread {
// ToastUtils.showToast("你的人脸信息已采集")
// }
} catch (e: Exception) {
e.printStackTrace()
}
}.start()
}
private var tcpClient: TcpClient? = null
private fun addSocketListener() {
//val ipAddress = NetworkUtils.getIPAddress(true)
//Log.d(TAG, "addSocketListener,ipAddress: $ipAddress");
tcpClient = TcpClient(
"192.168.1.95",
5000,
GlobalData.deviceId, // clientId
5000, // connectTimeoutMs
10 * 1000, // heartbeatIntervalMs
30 * 1000 // heartbeatTimeoutMs
)
tcpClient?.setListener(object : TcpClientListenerImpl() {
override fun onSendSuccess(json: JSONObject?) {
super.onSendSuccess(json)
// toast("发送成功")
}
override fun onSendFailed(json: JSONObject?, e: java.lang.Exception?) {
super.onSendFailed(json, e)
ToastUtils.showToast("发送失败${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();
try {
LanServer.getInstance().let {
it.setListener(object : LanServerListenerImpl() {
override fun onMessageReceived(clientId: String?, message: JSONObject?) {
super.onMessageReceived(clientId, message)
ToastUtils.showToast("收到消息clientId=$clientId")
}
})
it.start()
}
} catch (e: Exception) {
e.printStackTrace()
}
}
private fun clearFaceData() {
Thread {
val faceDao = FaceDatabase.getInstance(this).faceDao()
faceDao.deleteTempUserFaceData()
recognizeViewModel.refreshFaceList();
}.start()
}
private val WAITING_TIME = 5 * 1000L
private var checkStartTime = 0L
private var checkFaceJob: Job?=null
private fun checkFaceState() {
checkFaceJob = executor.startIntervalTask(5) {
if (System.currentTimeMillis() - checkStartTime >= WAITING_TIME && currentUserId.isNullOrBlank()) {
checkFaceJob?.cancel()
//超过5秒采集人脸并识别
collectFace()
return@startIntervalTask
}
}
}
}
@@ -39,7 +39,8 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
context: Context,
pageType: PageType,
equipmentUserInfo: EquipmentUserInfo? = null,
isAdmin: Boolean = false
isAdmin: Boolean = false,
block:()->Unit={}
) {
val intent = Intent(context, MainActivity::class.java)
intent.putExtra(PARAM_PAGE_TYPE, pageType.name)