联合支付模式使用人脸识别生成就餐记录

This commit is contained in:
2026-03-19 14:19:20 +08:00
parent a6d2441704
commit b51be58c64
8 changed files with 176 additions and 24 deletions
@@ -68,4 +68,5 @@ object GlobalKey {
const val KEY_USER_INFO = "userInfoKey"
const val KEY_PICKUP_MODE = "pickupMode"
const val KEY_CHARGE_MODE = "chargeMode"
const val KEY_SETTLEMENT_MODE = "settlementMode"
}
@@ -9,6 +9,7 @@ import androidx.activity.viewModels
import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope
import com.sw.dualscreen.GlobalData
import com.sw.dualscreen.GlobalKey
import com.sw.dualscreen.databinding.ActivityInitBinding
import com.sw.dualscreen.dialog.RemindDialog
import com.sw.dualscreen.ext.clickWithDebounce
@@ -18,6 +19,7 @@ import com.sw.dualscreen.objbox.Food
import com.sw.dualscreen.objbox.FoodModule
import com.sw.dualscreen.objbox.ObjectBox
import com.sw.dualscreen.utils.L
import com.sw.dualscreen.utils.SPUtil
import com.sw.dualscreen.viewmodel.BaseViewModel
import com.sw.dualscreen.viewmodel.UserViewModel
import com.sw.plate.utils.AppUtil
@@ -110,6 +112,10 @@ class InitActivity : BaseActivity<ActivityInitBinding>() {
override fun initialize() {
super.initialize()
// TODO: 暂时写死,后续改为从接口获取结算类型 ------------------------------------------
val settlementMode = 0
SPUtil.getInstance().put(GlobalKey.KEY_SETTLEMENT_MODE, settlementMode)
registerKeyEvent()
initNetworkTimer()
binding.okButton.clickWithDebounce(500) {
@@ -117,7 +117,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
checkedItem = item
notifyDataSetChanged()
updateCurrentFood(item)
//0-计费,1-不计费
val mode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0)
//不计费模式切换菜品,重新加载数据
if (mode == 1) {
@@ -595,11 +595,13 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
}
}
}
//根据付费模式确认是否显示按钮
binding.btnPay.run {
val mode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0)
if (mode == 0) visible() else gone()
//0-计费,1-不计费
val chargeMode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0)
//0-联合支付,1-独立支付
val settlementMode = SPUtil.getInstance().get(GlobalKey.KEY_SETTLEMENT_MODE, 1)
if (settlementMode == 1 && chargeMode == 0) visible() else gone()
}
}
@@ -634,16 +636,26 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
lastTouchTime = System.currentTimeMillis()
}
fun joinPayment() {
}
fun createOrder(
foodInfo: FoodInfo,
foodWeight: Int,
eatWeight: Int,
eatNum: Int,
userId: String?,
isMember:Boolean,
notEnoughOneBlock: () -> Unit = {},
block: () -> Unit
) {
log("foodWeight=$foodWeight,eatWeight=$eatWeight")
//0-联合支付,1-独立支付
val settlementMode = SPUtil.getInstance().get(GlobalKey.KEY_SETTLEMENT_MODE, 1)
//0-计费,1-不计费
val chargeMode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0)
//0-即放即取,1-余量计量
val pickupMode = SPUtil.getInstance().get(GlobalKey.KEY_PICKUP_MODE, 0) ?: 0
// if (pickupMode == 0) {
// if (foodWeight <= 5) {
@@ -661,7 +673,6 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
return
}
showWaitingDialog("加载中,请稍候……")
val chargeMode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0)
val order = FoodOrder(
deviceId = GlobalData.deviceId,
foodId = foodInfo.foodId,
@@ -675,7 +686,9 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
userId = userId,
notPay = chargeMode != 0,
//即放即取-1,称重-2
mode = if (pickupMode == 1) 1 else 2
mode = if (pickupMode == 1) 1 else 2,
paymentFrom = if (settlementMode == 0) 1 else 2,
member = isMember
)
submitOrder(order, block)
}
@@ -734,6 +747,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
@Subscribe(threadMode = ThreadMode.MAIN)
fun onPaySuccessEvent(event: PaySuccessEvent) {
isRefreshPage = true
//0-计费,1-不计费
val chargeMode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0) ?: 0
presentation?.hideNutritionView(chargeMode)
presentation?.cancel()
@@ -768,7 +782,9 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
}
//val realWeight = (lastWeight * 1000).roundToInt()
//0-即放即取,1-余量计量
val mealPickupMode = SPUtil.getInstance().get(GlobalKey.KEY_PICKUP_MODE, 0) ?: 0
//0-计费,1-不计费
val chargeMode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0) ?: 0
var foodWeight = 0.0
var eatWeight = 0.0
@@ -802,6 +818,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
eatWeight = eatWeight.roundToInt(),
eatNum = eatNum,
userId = null,
isMember = false
) {
isRefreshPage = false
shutdownCamera()
@@ -1035,9 +1052,12 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
log("registerDataChange photoUri 识别数据名称:$foodName")
runOnUiThread {
binding.flPay.run {
val chargeMode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0)
//0-联合支付,1-独立支付
val settlementMode = SPUtil.getInstance().get(GlobalKey.KEY_SETTLEMENT_MODE, 1)
//0-计费,1-不计费
if (chargeMode == 0) visible() else gone()
val chargeMode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0)
//独立支付+计费模式才显示“去结算”按钮,否则使用人脸识别
if (settlementMode == 1 && chargeMode == 0) visible() else gone()
}
}
if (TextUtils.isEmpty(foodName)) {
@@ -287,6 +287,7 @@ class PayActivity : BaseActivity<ActivityPayBinding>() {
}
fun bindOrder(userId: String, block: (Boolean) -> Unit) {
//0-即放即取,1-余量计量
val pickupMode = SPUtil.getInstance().get(GlobalKey.KEY_PICKUP_MODE, 0)
val mode = if (pickupMode == 1) 1 else 2
userViewModel.bindOrder(userId, foodOrderId, mode = mode) { bindResult ->
@@ -19,19 +19,21 @@ class BusinessFragment: BaseFragment<FragmentBusinessBinding>() {
}
override fun initialize() {
binding.rgSettlement.let {
//val settlementMode = if (binding.rgSettlement.checkedRadioButtonId == R.id.rbJointPayment) 0 else 1
val mode = SPUtil.getInstance().get(GlobalKey.KEY_SETTLEMENT_MODE, 1)
it.check(if (mode == 0) R.id.rbJointPayment else R.id.rbIndependentPayment)
binding.rbJointPayment.isEnabled = false
binding.rbIndependentPayment.isEnabled = false
}
binding.rgCharge.let {
// it.setOnCheckedChangeListener { group, checkedId ->
// val mode = if (checkedId == R.id.rbChargeYes) 0 else 1
// SPUtil.getInstance().put(GlobalKey.KEY_CHARGE_MODE, mode)
// }
//0-计费,1-不计费
val mode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0)
it.check(if (mode == 0) R.id.rbChargeYes else R.id.rbChargeNot)
}
binding.rgTakeFood.let {
// it.setOnCheckedChangeListener { group, checkedId ->
// val mode = if (checkedId == R.id.rbPickAndPlace) 0 else 1
// SPUtil.getInstance().put(GlobalKey.KEY_PICKUP_MODE, mode)
// }
//0-即放即取,1-余量计量
val mode = SPUtil.getInstance().get(GlobalKey.KEY_PICKUP_MODE, 0)
it.check(if (mode == 0) R.id.rbPickAndPlace else R.id.rbSurplusCalculate)
}
@@ -39,6 +41,10 @@ class BusinessFragment: BaseFragment<FragmentBusinessBinding>() {
SensorScaleUtils.tare()
}
binding.btnConfirm.setOnClickListener { v ->
// if (binding.rgSettlement.checkedRadioButtonId == -1) {
// ToastUtils.showToast("请设置结算模式")
// return@setOnClickListener
// }
if (binding.rgCharge.checkedRadioButtonId == -1) {
ToastUtils.showToast("请设置计费模式")
return@setOnClickListener
@@ -50,6 +56,7 @@ class BusinessFragment: BaseFragment<FragmentBusinessBinding>() {
val chargeMode = if (binding.rgCharge.checkedRadioButtonId == R.id.rbChargeYes) 0 else 1
//原来的支付模式
//0-计费,1-不计费
val oldChargeMode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0)
if (chargeMode != oldChargeMode) {
//支付模式有变化通知首页页面刷新
@@ -34,7 +34,11 @@ data class FoodOrder(
var remark: String? = "",
//即放即取-1,称重-2
var mode: Int
var mode: Int,
//设备模式,1 结算终端,2档口机
var paymentFrom: Int,
//是否会员
var member: Boolean
)
@Parcelize
@@ -114,6 +114,7 @@ class MainScreenPresentation(
var isKeepFaceState = false
var currentUserId: String? = null
var isMember: Boolean = false
var facePreviewInfoList: MutableList<FacePreviewInfo>? = null
@@ -121,11 +122,15 @@ class MainScreenPresentation(
super.onCreate(savedInstanceState)
binding = PresentationMainScreenBinding.inflate(layoutInflater)
setContentView(binding.root)
//0-即放即取,1-余量计量
mealPickupMode = SPUtil.getInstance().get(GlobalKey.KEY_PICKUP_MODE, 0) ?: 0
window?.setBackgroundDrawableResource(android.R.color.white)
initView()
//0-计费,1-不计费
val chargeMode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0)
if (chargeMode == 1) {
//0-联合支付,1-独立支付
val settlementMode = SPUtil.getInstance().get(GlobalKey.KEY_SETTLEMENT_MODE, 1)
if (settlementMode == 0 || chargeMode == 1) {
setupArcCamera()
}
registerDataChange()
@@ -138,7 +143,9 @@ class MainScreenPresentation(
lastWeight = weight * 1000 // 将千克转成克
Timber.tag(TAG)
.d("updateWeight lastWeight = $weight, currentStep = $currentStep, isGoStep1 = $isGoStep1")
//0-即放即取,1-余量计量
mealPickupMode = SPUtil.getInstance().get(GlobalKey.KEY_PICKUP_MODE, 0) ?: 0
//0-计费,1-不计费
val chargeMode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0)
// if (mealPickupMode == 1 && chargeMode == 0) {
// //余量计量+计费模式
@@ -586,6 +593,9 @@ class MainScreenPresentation(
binding.tvFoodName.text = foodInfo.foodName
binding.ivPreviewImage.gone()
binding.ivFrame.gone()
//0-联合支付,1-独立支付
val settlementMode = SPUtil.getInstance().get(GlobalKey.KEY_SETTLEMENT_MODE, 1)
//0-计费,1-不计费
val chargeMode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0)
if (chargeMode == 0) {
binding.ivRecImage.let {
@@ -597,15 +607,19 @@ class MainScreenPresentation(
} else {
binding.ivRecImage.gone()
}
val mode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0)
if (mode == 0) {
//独立支付+计费模式,使用人脸识别
if (settlementMode == 1 && chargeMode == 0) {
//计费,查询营养信息、价格信息------------------------
loadBilledMode()
} else {
//不计费
//开启人脸识别
if (currentStep == 1 || binding.tvFaceTip.isVisible.not()) {
//联合支付,进行人脸识别
if (settlementMode == 0) {
step2FaceRecognizing(foodInfo)
} else {
//不计费,开启人脸识别
if (currentStep == 1 || binding.tvFaceTip.isVisible.not()) {
step2FaceRecognizing(foodInfo)
}
}
}
//if (currentStep == 1) {
@@ -785,7 +799,10 @@ class MainScreenPresentation(
fun resumeCamera() {
Timber.tag(TAG).d("resumeCamera isRecognition = $isRecognition")
isRecognition = true
if (rgbCameraHelper != null && rgbCameraHelper!!.isStopped) {
if (rgbCameraHelper == null) {
setupArcCamera()
rgbCameraHelper!!.start()
} else if (rgbCameraHelper!!.isStopped) {
rgbCameraHelper!!.start()
}
}
@@ -859,6 +876,7 @@ class MainScreenPresentation(
val faceEntity = compareResult.faceEntity
val userId = faceEntity.userName
currentUserId = userId
isMember = faceEntity.userType == "1"
isAgainLoadData = false
if (userId == null) return@Observer
//ToastUtils.showToast("人脸识别成功,userId = $userId")
@@ -978,6 +996,7 @@ class MainScreenPresentation(
}
if (facePreviewInfoList.isNullOrEmpty()) {
currentUserId = null
isMember = false
}
//recognizeViewModel.clearLeftFace(facePreviewInfoList)
clearLeftFaceData()
@@ -1139,6 +1158,7 @@ class MainScreenPresentation(
.d("listIsEmpty=$listIsEmpty,lastFaceTrackId=$lastFaceTrackId,listFirstTrackId=$listFirstTrackId")
if (listIsEmpty || (lastFaceTrackId != listFirstTrackId)) {
if (lastFaceTrackId != -1 && currentUserId != null) {
//0-即放即取,1-余量计量
mealPickupMode = SPUtil.getInstance().get(GlobalKey.KEY_PICKUP_MODE, 0) ?: 0
Timber.tag(TAG).i("$lastFaceTrackId 用户离开")
lastFaceTrackId = -1
@@ -1159,6 +1179,7 @@ class MainScreenPresentation(
ToastUtils.showToast("订单已生成")
}
currentUserId = null
isMember = false
//ToastUtils.showToast("isKeepFaceState=$isKeepFaceState,mealPickupMode=$mealPickupMode")
//|| isKeepFaceState
if (mealPickupMode == 1) {
@@ -1173,8 +1194,19 @@ class MainScreenPresentation(
}
}
/**
* 人脸离开后调用创建订单接口
*/
fun createOrder(notEnoughOneBlock: () -> Unit = {}, block: () -> Unit) {
////0-联合支付,1-独立支付
//val settlementMode = SPUtil.getInstance().get(GlobalKey.KEY_SETTLEMENT_MODE, 1)
//0-即放即取,1-余量计量
mealPickupMode = SPUtil.getInstance().get(GlobalKey.KEY_PICKUP_MODE, 0) ?: 0
//if (settlementMode == 0) {
// //使用联合支付方式
// ToastUtils.showToast("使用联合支付方式")
// return
//}
val eatWeight = if (mealPickupMode == 0) {
//即放即取
recognitionWeight
@@ -1196,6 +1228,7 @@ class MainScreenPresentation(
eatWeight = eatWeight.roundToInt(),
eatNum = activity.getEatNum(eatWeight, currentFood!!.specWeight),
userId = currentUserId,
isMember = isMember ,
notEnoughOneBlock = notEnoughOneBlock,
block = {
activity.runOnUiThread {
@@ -6,6 +6,7 @@
android:layout_height="match_parent"
android:orientation="vertical">
<!-- 结算设置模块 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -16,6 +17,85 @@
android:paddingTop="35dp"
android:paddingBottom="42dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawablePadding="17dp"
android:text="结算设置"
android:textColor="@color/black"
android:textSize="36sp"
android:textStyle="bold"
app:drawableStartCompat="@drawable/line_shape" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="(不允许修改,由后端配置)"
android:textColor="#FFFF3232"
android:textSize="20sp" />
</LinearLayout>
<RadioGroup
android:id="@+id/rgSettlement"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="35dp"
android:gravity="center_vertical"
android:orientation="horizontal">
<RadioButton
android:id="@+id/rbJointPayment"
android:layout_width="0dp"
android:layout_height="120dp"
android:layout_weight="1"
android:background="@drawable/setting_check_selector"
android:button="@null"
android:gravity="center"
android:maxLines="1"
android:text="联合支付"
android:textColor="@color/setting_radio"
android:textSize="30sp"
android:textStyle="bold" />
<RadioButton
android:id="@+id/rbIndependentPayment"
android:layout_width="0dp"
android:layout_height="120dp"
android:layout_marginStart="32dp"
android:layout_weight="1"
android:background="@drawable/setting_check_selector"
android:button="@null"
android:gravity="center"
android:maxLines="1"
android:text="独立支付"
android:textColor="@color/setting_radio"
android:textSize="30sp"
android:textStyle="bold"
tools:checked="true" />
</RadioGroup>
</LinearLayout>
<!-- 计费设置模块 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/setting_border"
android:orientation="vertical"
android:layout_marginHorizontal="32dp"
android:layout_marginTop="42dp"
android:paddingHorizontal="32dp"
android:paddingTop="35dp"
android:paddingBottom="42dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"