From 04e318f47bfc8047f37db00e5598722b921e5190 Mon Sep 17 00:00:00 2001 From: lvmeng <848755140@qq.com> Date: Fri, 5 Dec 2025 18:03:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=94=AF=E4=BB=98=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sw/dualscreen/activity/MainActivity.kt | 28 +-- .../com/sw/dualscreen/activity/PayActivity.kt | 64 ++++-- .../activity/fragment/pay/CashPayFragment.kt | 32 ++- .../activity/fragment/pay/FacePayFragment.kt | 5 +- .../fragment/pay/NumberPayFragment.kt | 2 +- .../fragment/pay/PayResultFragment.kt | 90 ++++++--- .../fragment/pay/ScanQrCodePayFragment.kt | 20 +- .../dualscreen/model/response/ApiResponse.kt | 12 +- .../sw/dualscreen/model/response/DataBean.kt | 21 +- .../sw/dualscreen/model/response/FoodInfo.kt | 22 +- .../model/response/UserFaceModel.kt | 18 +- .../sw/dualscreen/network/api/ApiService.kt | 69 ++++++- .../network/interceptor/RequestInterceptor.kt | 1 + .../presentation/MainScreenPresentation.kt | 144 +++++++------ .../presentation/UserNutritionUtils.kt | 116 +++++++---- .../presentation/pay/FacePayPresentation.kt | 189 +++++++++--------- .../dualscreen/repository/RemoteRepository.kt | 79 +++++++- .../com/sw/dualscreen/utils/SpannedUtils.kt | 19 +- .../sw/dualscreen/viewmodel/BaseViewModel.kt | 2 +- .../sw/dualscreen/viewmodel/UserViewModel.kt | 164 ++++++++++++++- app/src/main/res/drawable/ic_gray_big.9.png | Bin 0 -> 1381 bytes app/src/main/res/drawable/ic_gray_small.9.png | Bin 0 -> 876 bytes app/src/main/res/drawable/ic_green_big.9.png | Bin 0 -> 1432 bytes .../main/res/drawable/ic_green_small.9.png | Bin 0 -> 914 bytes app/src/main/res/drawable/ic_orange_big.9.png | Bin 0 -> 1343 bytes .../main/res/drawable/ic_orange_small.9.png | Bin 0 -> 863 bytes app/src/main/res/drawable/ic_red_big.9.png | Bin 0 -> 1304 bytes app/src/main/res/drawable/ic_red_small.9.png | Bin 0 -> 829 bytes app/src/main/res/drawable/ic_yellow_big.9.png | Bin 0 -> 1437 bytes .../main/res/drawable/ic_yellow_small.9.png | Bin 0 -> 925 bytes app/src/main/res/layout/activity_main.xml | 3 +- app/src/main/res/layout/activity_pay.xml | 4 +- app/src/main/res/layout/dialog_waiting.xml | 3 +- app/src/main/res/layout/fragment_cash_pay.xml | 17 ++ .../main/res/layout/fragment_pay_result.xml | 5 +- .../res/layout/presentation_main_screen.xml | 6 +- .../com/sw/plate/utils/arcface/FaceApi.java | 10 + .../arcface/viewmodel/RecognizeViewModel.java | 1 + 38 files changed, 830 insertions(+), 316 deletions(-) create mode 100644 app/src/main/res/drawable/ic_gray_big.9.png create mode 100644 app/src/main/res/drawable/ic_gray_small.9.png create mode 100644 app/src/main/res/drawable/ic_green_big.9.png create mode 100644 app/src/main/res/drawable/ic_green_small.9.png create mode 100644 app/src/main/res/drawable/ic_orange_big.9.png create mode 100644 app/src/main/res/drawable/ic_orange_small.9.png create mode 100644 app/src/main/res/drawable/ic_red_big.9.png create mode 100644 app/src/main/res/drawable/ic_red_small.9.png create mode 100644 app/src/main/res/drawable/ic_yellow_big.9.png create mode 100644 app/src/main/res/drawable/ic_yellow_small.9.png diff --git a/app/src/main/java/com/sw/dualscreen/activity/MainActivity.kt b/app/src/main/java/com/sw/dualscreen/activity/MainActivity.kt index ad395b8..9f2171f 100644 --- a/app/src/main/java/com/sw/dualscreen/activity/MainActivity.kt +++ b/app/src/main/java/com/sw/dualscreen/activity/MainActivity.kt @@ -121,6 +121,8 @@ class MainActivity : BaseActivity() { private fun initData() { // viewModel.getEquipmentToken() viewModel.getUserFaceCache(pageNo = 1) + //viewModel.getUserFaceCache2() + // presentation?.step1() presentation?.step1FoodRecognizing() } @@ -219,7 +221,15 @@ class MainActivity : BaseActivity() { ToastUtils.showToast("暂无识别数据,请搜索选择") return@setOnClickListener } - createOrder(checkedItem!!) + + val realWeight = (lastWeight * 1000).roundToInt() + createOrder(foodInfo = checkedItem!!, foodWeight = realWeight, eatWeight = realWeight) { + presentation?.dismiss() + startActivity(Intent(this, PayActivity::class.java).apply { + putExtra(PayActivity.FOOD_INFO, checkedItem!!) + putExtra(PayActivity.FOOD_ORDER_ID, foodOrderId) + }) + } } } } @@ -656,19 +666,18 @@ class MainActivity : BaseActivity() { lastTouchTime = System.currentTimeMillis() } - private fun createOrder(foodInfo: FoodInfo) { + fun createOrder(foodInfo: FoodInfo, foodWeight: Int, eatWeight: Int, block:()-> Unit) { val mode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0) - val realWeight = (lastWeight * 1000).roundToInt() val order = FoodOrder( deviceId = GlobalData.deviceId, foodId = foodInfo.foodId, foodName = foodInfo.foodName ?: "", foodMaterialId = foodInfo.foodMaterialId ?: "", specId = foodInfo.specId ?: "", - foodWeight = realWeight, - eatWeight = realWeight, + foodWeight = foodWeight, + eatWeight = eatWeight, //根据specId对应规格重量计算 - eatNum = getEatNum(realWeight, foodInfo.specWeight ?: 0.0), + eatNum = getEatNum(foodWeight, foodInfo.specWeight ?: 0.0), userId = null, notPay = mode != 0, ) @@ -679,12 +688,7 @@ class MainActivity : BaseActivity() { return@runOnUiThread } foodOrderId = orderId - presentation?.dismiss() - startActivity(Intent(this, PayActivity::class.java).apply { - putExtra(PayActivity.FOOD_INFO, foodInfo) - putExtra(PayActivity.FOOD_ORDER_ID, orderId) - }) -// ToastUtils.showToast("订单已生成") + block() } } } diff --git a/app/src/main/java/com/sw/dualscreen/activity/PayActivity.kt b/app/src/main/java/com/sw/dualscreen/activity/PayActivity.kt index b3fb237..5ac9715 100644 --- a/app/src/main/java/com/sw/dualscreen/activity/PayActivity.kt +++ b/app/src/main/java/com/sw/dualscreen/activity/PayActivity.kt @@ -14,6 +14,7 @@ import com.sw.dualscreen.model.response.MemberInfo import com.sw.dualscreen.presentation.pay.ScanQrCodePayPresentation import com.sw.dualscreen.viewmodel.BaseViewModel import com.sw.dualscreen.viewmodel.UserViewModel +import com.sw.plate.utils.ToastUtils import com.sw.plate.utils.arcface.viewmodel.RecognizeViewModel class PayActivity : BaseActivity() { @@ -52,13 +53,13 @@ class PayActivity : BaseActivity() { var facePayFragment: FacePayFragment? = null private var payResultFragment: PayResultFragment? = null - var foodOrderId:String = "" + var foodOrderId: String = "" @Suppress("DEPRECATION") override fun initialize() { super.initialize() foodInfo = intent.getParcelableExtra(FOOD_INFO) - foodOrderId = intent.getStringExtra(FOOD_ORDER_ID)?:"" + foodOrderId = intent.getStringExtra(FOOD_ORDER_ID) ?: "" // totalAmount = intent.getDoubleExtra(TOTAL_AMOUNT,0.0) // memberInfo = intent.getParcelableExtra(MEMBER_INFO) binding.tvFoodName.text = foodInfo?.foodName @@ -164,40 +165,63 @@ class PayActivity : BaseActivity() { private var scanQrCodePayPresentation: ScanQrCodePayPresentation? = null var memberInfo: MemberInfo? = null - fun showPayInfo(memberInfo: MemberInfo) { + fun showPayInfo(type: Int = 1, isVip: Boolean = false, memberInfo: MemberInfo? = null) { this.memberInfo = memberInfo - payResultFragment = PayResultFragment.instance(1, memberInfo) + payResultFragment = PayResultFragment.instance(type, memberInfo) showFragment(payResultFragment!!, TAG_PAY_RESULT) if (displays.size > 1) { scanQrCodePayPresentation = ScanQrCodePayPresentation( activity = this, display = displays[1], - type = 1 + type = type ) { scanQrCodePayPresentation?.dismiss() }.also { it.foodName = foodInfo?.foodName - it.totalPrice = foodInfo?.vipPrice?:0.0 + //确认使用vipPrice 还是 specPrice + val totalPrice = if (isVip) foodInfo?.vipPrice else foodInfo?.specPrice + it.totalPrice = totalPrice ?: 0.0 } scanQrCodePayPresentation?.show() } } - fun showPaySuccess() { - payResultFragment = PayResultFragment.instance(2, memberInfo!!) - showFragment(payResultFragment!!, TAG_PAY_RESULT) - if (displays.size > 1) { - scanQrCodePayPresentation = ScanQrCodePayPresentation( - activity = this, - display = displays[1], - type = 2 - ) { - scanQrCodePayPresentation?.dismiss() - }.also { - it.foodName = foodInfo?.foodName - it.totalPrice = foodInfo?.vipPrice?:0.0 + fun showPaySuccess(isVip: Boolean) { + showPayInfo(type = 2, isVip = isVip, memberInfo = memberInfo) + } + + fun getQrCodeImg(orderId: String, userId: String? = null, block: (String?) -> Unit) { + userViewModel.getQrCodeImg(orderId = orderId, userId = userId) { qrCodeImg -> + runOnUiThread { + if (qrCodeImg.isNullOrBlank()) { + ToastUtils.showToast("获取二维码失败") + return@runOnUiThread + } + block(qrCodeImg) } - scanQrCodePayPresentation?.show() + } + } + + fun cashPay(param: HashMap, block: (Boolean) -> Unit) { + userViewModel.cashPay(param) { + runOnUiThread { + block(it) + } + } + } + + fun memberPay(param: HashMap, block: () -> Unit) { + userViewModel.memberPay(param) { + runOnUiThread { + block() + } + } + } + + fun paySuccessCallback(isVip: Boolean, block: () -> Unit = {}) { + userViewModel.paySuccessCallback(queryType = 1, orderId = foodOrderId) { + showPaySuccess(isVip) + block() } } diff --git a/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/CashPayFragment.kt b/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/CashPayFragment.kt index d77fc6a..4796dee 100644 --- a/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/CashPayFragment.kt +++ b/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/CashPayFragment.kt @@ -7,11 +7,13 @@ import androidx.core.text.buildSpannedString import com.sw.dualscreen.activity.PayActivity import com.sw.dualscreen.activity.fragment.BaseFragment import com.sw.dualscreen.databinding.FragmentCashPayBinding +import com.sw.dualscreen.ext.format2String import com.sw.dualscreen.presentation.pay.CashPayPresentation +import com.sw.plate.utils.ToastUtils class CashPayFragment : BaseFragment() { - private lateinit var payActivity: PayActivity + private var payActivity: PayActivity? = null private var foodName: String? = null private var payAmount: String? = null @@ -22,12 +24,30 @@ class CashPayFragment : BaseFragment() { } override fun initialize() { - payActivity = requireActivity() as PayActivity + payActivity = requireActivity() as? PayActivity - foodName = payActivity.foodInfo?.foodName - payAmount = "36.80" + foodName = payActivity?.foodInfo?.foodName + payAmount = payActivity?.foodInfo?.specPrice.format2String(2) binding.tvRealAmount.text = getAmountText(payAmount?:"") + binding.btnConfirmPayFinish.setOnClickListener { + payActivity?.cashPay(hashMapOf( + //标价金额(单位为元) + "totalFee" to (payAmount?:""), + //订单类型(0付款1会员充值) + "orderType" to "0", + //商户订单号 + "orderNo" to (payActivity?.foodOrderId?:""), + //支付来源:0线下收款 、3:线上纯会员支付 101:支付宝主动、102:支付宝被动、201:微信主动、202:微信被动 + "paySource" to "0" + )) { paySuccess -> + if (paySuccess.not()) { + ToastUtils.showToast("接口调用失败") + return@cashPay + } + payActivity?.showPaySuccess( false) + } + } showSubScreen() } override fun onHiddenChanged(hidden: Boolean) { @@ -36,7 +56,7 @@ class CashPayFragment : BaseFragment() { delayDismiss() return } - showSubScreen() + //showSubScreen() } override fun onDestroy() { @@ -54,7 +74,7 @@ class CashPayFragment : BaseFragment() { private fun showSubScreen() { // 查找副屏(通常索引为1) if (displays.size > 1) { - presentation = CashPayPresentation(activity = payActivity, display = displays[1]) { + presentation = CashPayPresentation(activity = payActivity!!, display = displays[1]) { presentation?.dismiss() }.also { it.foodName = foodName diff --git a/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/FacePayFragment.kt b/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/FacePayFragment.kt index a933e2f..9201fb4 100644 --- a/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/FacePayFragment.kt +++ b/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/FacePayFragment.kt @@ -4,6 +4,7 @@ import android.graphics.Bitmap import com.sw.dualscreen.activity.PayActivity import com.sw.dualscreen.activity.fragment.BaseFragment import com.sw.dualscreen.databinding.FragmentFacePayBinding +import com.sw.dualscreen.ext.format2String import com.sw.dualscreen.presentation.pay.FacePayPresentation class FacePayFragment : BaseFragment() { @@ -22,7 +23,7 @@ class FacePayFragment : BaseFragment() { // payActivity?.showPayResult() // } foodName = payActivity?.foodInfo?.foodName - payAmount = "36.80" + payAmount = payActivity?.foodInfo?.specPrice.format2String(2) showSubScreen() } @@ -32,7 +33,7 @@ class FacePayFragment : BaseFragment() { delayDismiss() return } - showSubScreen() + //showSubScreen() } override fun onDestroy() { diff --git a/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/NumberPayFragment.kt b/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/NumberPayFragment.kt index eefcadc..1554cce 100644 --- a/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/NumberPayFragment.kt +++ b/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/NumberPayFragment.kt @@ -32,7 +32,7 @@ class NumberPayFragment: BaseFragment() { delayDismiss() return } - showSubScreen() + //showSubScreen() } override fun onDestroy() { diff --git a/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/PayResultFragment.kt b/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/PayResultFragment.kt index ff7f644..9e2d76f 100644 --- a/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/PayResultFragment.kt +++ b/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/PayResultFragment.kt @@ -1,12 +1,6 @@ package com.sw.dualscreen.activity.fragment.pay import android.os.Bundle -import android.text.Spanned -import android.text.SpannedString -import android.text.style.AbsoluteSizeSpan -import android.text.style.ForegroundColorSpan -import androidx.core.graphics.toColorInt -import androidx.core.text.buildSpannedString import com.sw.dualscreen.R import com.sw.dualscreen.activity.PayActivity import com.sw.dualscreen.activity.fragment.BaseFragment @@ -16,7 +10,6 @@ import com.sw.dualscreen.ext.gone import com.sw.dualscreen.ext.invisible import com.sw.dualscreen.ext.load import com.sw.dualscreen.ext.visible -import com.sw.dualscreen.model.response.FoodInfo import com.sw.dualscreen.model.response.MemberInfo import com.sw.dualscreen.model.response.TextBean import com.sw.dualscreen.utils.SpannedUtils @@ -30,7 +23,7 @@ class PayResultFragment : BaseFragment() { companion object { const val PAGE_TYPE = "pageType" const val MEMBER_INFO = "memberInfo" - fun instance(pageType: Int, memberInfo: MemberInfo): PayResultFragment { + fun instance(pageType: Int, memberInfo: MemberInfo?): PayResultFragment { return PayResultFragment().apply { arguments = Bundle().also { it.putInt(PAGE_TYPE, pageType) @@ -53,16 +46,24 @@ class PayResultFragment : BaseFragment() { binding.btnBack.setOnClickListener { //payActivity?.showFacePay() } + if (memberInfo != null) { + binding.layoutMemberInfo.visible() + } else { + binding.layoutMemberInfo.gone() + + } arguments?.let { pageType = it.getInt(PAGE_TYPE, 0) memberInfo = it.getParcelable(MEMBER_INFO) } totalPrice = payActivity?.foodInfo?.vipPrice ?: 0.0 - balance = (memberInfo?.topUpBalance ?: 0.0) + (memberInfo?.rewardBalance ?: 0.0) - realPayPrice = if (balance >= totalPrice) 0.0 else totalPrice - balance - expensesBalance = if (balance >= totalPrice) totalPrice else balance - memberInfo?.let { loadUserInfo(it) } + memberInfo?.let { + balance = (memberInfo?.topUpBalance ?: 0.0) + (memberInfo?.rewardBalance ?: 0.0) + realPayPrice = if (balance >= totalPrice) 0.0 else totalPrice - balance + expensesBalance = if (balance >= totalPrice) totalPrice else balance + loadUserInfo(it) + } when (pageType) { 0 -> { @@ -95,19 +96,24 @@ class PayResultFragment : BaseFragment() { ) if (balance >= totalPrice) { binding.ivPayQrCode.invisible() - binding.btnConfirmPay.isEnabled = true + binding.btnConfirmPay.run { + isEnabled = true + //点击支付,接口成功打开成功页面 + setOnClickListener { + memberPay() + } + } } else { binding.ivPayQrCode.visible() -// binding.ivPayQrCode.load(payQrCodePic) binding.btnConfirmPay.isEnabled = false - } - //点击支付接口成功打开成功页面,或者扫码手动成功回调打开成功页面 - binding.btnConfirmPay.setOnClickListener { - payActivity?.showWaitingDialog("支付中,请稍后……") - binding.root.postDelayed({ - payActivity?.hideWaitingDialog() - payActivity?.showPaySuccess() - },1000) + payActivity?.getQrCodeImg( + orderId = payActivity!!.foodOrderId, + userId = memberInfo!!.id + ) { qrCodeImg -> + binding.ivPayQrCode.load(qrCodeImg) + //扫码成功回调打开成功页面 + payActivity?.paySuccessCallback(true) + } } } @@ -115,9 +121,22 @@ class PayResultFragment : BaseFragment() { binding.layoutPayInfo.gone() binding.layoutPaySuccess.visible() - binding.tvPayInfo.text = - "应收 ${totalPrice.format2String(2)} 元,余额扣除 ${expensesBalance.format2String(2)} 元" - binding.tvPayAmount.text = "收款金额 ${realPayPrice.format2String(2)} 元" + if (memberInfo != null) { + val remainBalance = if (balance >= totalPrice) balance - totalPrice else 0.0 + binding.tvUserBalance.text = SpannedUtils.getAmountText( + listOf( + TextBean(text = "¥", textSize = 24), + TextBean(text = remainBalance.format2String(2), textSize = 36), + ) + ) + binding.tvPayAmount.text = "收款金额 ${realPayPrice.format2String(2)} 元" + binding.tvPayInfo.text = + "应收 ${totalPrice.format2String(2)} 元,余额扣除 ${expensesBalance.format2String(2)} 元" + } else { + binding.tvPayAmount.text = "收款金额 ${totalPrice.format2String(2)} 元" + binding.tvPayInfo.text = + "应收 ${totalPrice.format2String(2)} 元" + } } else -> {} @@ -168,6 +187,25 @@ class PayResultFragment : BaseFragment() { phone } - + private fun memberPay() { + payActivity?.run { + showWaitingDialog("支付中,请稍后……") + memberPay( + hashMapOf( + //支付金额 + "totalFee" to totalPrice.format2String(2), + //订单号 + "orderNo" to payActivity!!.foodOrderId, + //用户id + "memberId" to memberInfo!!.id!! + ) + ) { + binding.root.postDelayed({ + hideWaitingDialog() + showPaySuccess(true) + },1000) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/ScanQrCodePayFragment.kt b/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/ScanQrCodePayFragment.kt index 1879b9d..36bfd33 100644 --- a/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/ScanQrCodePayFragment.kt +++ b/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/ScanQrCodePayFragment.kt @@ -24,7 +24,7 @@ class ScanQrCodePayFragment: BaseFragment() { private lateinit var payActivity: PayActivity private var foodName: String? = null private var payAmount: String? = null - private var payQrCodePic: Any? = null + private var payQrCodePic: String? = null var presentation: ScanQrCodePayPresentation?=null private var countDownJob: Job? = null @@ -37,14 +37,19 @@ class ScanQrCodePayFragment: BaseFragment() { foodName = payActivity.foodInfo?.foodName payAmount = payActivity.foodInfo?.specPrice.format2String(2) - payQrCodePic = R.drawable.ic_qrcode binding.tvRealAmount.text = getAmountText(payAmount?:"") - binding.ivPayQrCode.load(payQrCodePic) - binding.tvPayResult.text = "待支付(60s)..." - startCountDown() + payActivity.getQrCodeImg(orderId = payActivity.foodOrderId) { + payQrCodePic = it + binding.ivPayQrCode.load(payQrCodePic) + binding.tvPayResult.text = "待支付(60s)..." - showSubScreen() + payActivity.paySuccessCallback(false) + + showSubScreen() + + startCountDown() + } } override fun onHiddenChanged(hidden: Boolean) { @@ -53,7 +58,7 @@ class ScanQrCodePayFragment: BaseFragment() { delayDismiss() return } - showSubScreen() + //showSubScreen() } override fun onDestroy() { @@ -104,4 +109,5 @@ class ScanQrCodePayFragment: BaseFragment() { } ) } + } \ No newline at end of file diff --git a/app/src/main/java/com/sw/dualscreen/model/response/ApiResponse.kt b/app/src/main/java/com/sw/dualscreen/model/response/ApiResponse.kt index 10a7add..cdfcc10 100644 --- a/app/src/main/java/com/sw/dualscreen/model/response/ApiResponse.kt +++ b/app/src/main/java/com/sw/dualscreen/model/response/ApiResponse.kt @@ -3,14 +3,8 @@ package com.sw.dualscreen.model.response data class ApiResponse( val code: String, val msg: String? = "", - val data: T? = null -) { - fun isSuccess(): Boolean = ("00000" == code) - - val result: T? - get() = data - val message: String? - get() = msg -} + val data: T? = null, + val result: T? = null, +) diff --git a/app/src/main/java/com/sw/dualscreen/model/response/DataBean.kt b/app/src/main/java/com/sw/dualscreen/model/response/DataBean.kt index a1b6798..37848bd 100644 --- a/app/src/main/java/com/sw/dualscreen/model/response/DataBean.kt +++ b/app/src/main/java/com/sw/dualscreen/model/response/DataBean.kt @@ -50,6 +50,25 @@ data class MemberInfo( data class TextBean( var text: String, - var textSize: Int, + var textSize: Int = 0, var textColor: String? = null +) + +data class UserNutrition( + //姓名 + val name: String?, + //推荐能量 + val recommendEnergy: Double?, + //热量 + val calorie: Double?, + //果蔬 + val fruitsVegetables: Double?, + //肉蛋 + val meatEggs: Double?, + //主食 + val stapleFood: Double?, +) + +data class PayResult( + val paySuc: String? = null ) \ No newline at end of file diff --git a/app/src/main/java/com/sw/dualscreen/model/response/FoodInfo.kt b/app/src/main/java/com/sw/dualscreen/model/response/FoodInfo.kt index 3be4e88..35356fe 100644 --- a/app/src/main/java/com/sw/dualscreen/model/response/FoodInfo.kt +++ b/app/src/main/java/com/sw/dualscreen/model/response/FoodInfo.kt @@ -16,13 +16,13 @@ data class FoodInfo( //菜品名称 val foodName:String? = null, //能量 - val calorie:String? = null, + val calorie:Double? = null, //蛋白质 - val protein:String? = null, + val protein:Double? = null, //脂肪 - val fat:String? = null, + val fat:Double? = null, //碳水化合物 - val carbohydrate:String? = null, + val carbohydrate:Double? = null, //规格售卖价格(元) val specPrice: Double? = null, //VIP售卖价(元) @@ -33,6 +33,12 @@ data class FoodInfo( val specId:String? = null, //规格重量(g) val specWeight:Double? = null, + //主食 + val stapleFood:Double? = null, + //果蔬 + val fruitsVegetables:Double? = null, + //肉蛋 + val meatEggs:Double? = null, //----------------------------------- var score: Int = 0, @@ -42,12 +48,12 @@ data class FoodInfo( // @SerializedName("foodTypeAndRealIntakeVoList") // val foodTypeAndRealIntakeVoList: List? = listOf(), - @SerializedName("stFoodInfoMaterial") - val stFoodInfoMaterial: StFoodInfoMaterial? = StFoodInfoMaterial(), +// @SerializedName("stFoodInfoMaterial") +// val stFoodInfoMaterial: StFoodInfoMaterial? = StFoodInfoMaterial(), // @SerializedName("stFoodInfoPagoda") // val stFoodInfoPagoda: StFoodInfoPagoda? = StFoodInfoPagoda(), - @SerializedName("stFoodInfoPagodaAPPVO") - val stFoodInfoPagodaAPPVO: StFoodInfoPagodaAPPVO? = StFoodInfoPagodaAPPVO(), +// @SerializedName("stFoodInfoPagodaAPPVO") +// val stFoodInfoPagodaAPPVO: StFoodInfoPagodaAPPVO? = StFoodInfoPagodaAPPVO(), // @SerializedName("stFoodInfoSetting") // val stFoodInfoSetting: StFoodInfoSetting? = StFoodInfoSetting(), // @SerializedName("stFoodInfoSpecificationList") diff --git a/app/src/main/java/com/sw/dualscreen/model/response/UserFaceModel.kt b/app/src/main/java/com/sw/dualscreen/model/response/UserFaceModel.kt index be2d429..01b2dda 100644 --- a/app/src/main/java/com/sw/dualscreen/model/response/UserFaceModel.kt +++ b/app/src/main/java/com/sw/dualscreen/model/response/UserFaceModel.kt @@ -21,4 +21,20 @@ data class UserFaceModel( // @SerializedName("userId") val userId: String? = "", val faceFeatureStr: String? = "" -) : Parcelable \ No newline at end of file +) : Parcelable + +@Parcelize +data class UserFaceModel2( + val userId: String? = "", + val faceFeatureString: String? = "", + val face: String? = "" +) : Parcelable + +data class FaceData( + val nextPageIndex:Int, + val total:Int, + val size:Int, + val current:Int, + val pages:Int, + val records: List?=null +) \ No newline at end of file diff --git a/app/src/main/java/com/sw/dualscreen/network/api/ApiService.kt b/app/src/main/java/com/sw/dualscreen/network/api/ApiService.kt index 133d908..ef3f709 100644 --- a/app/src/main/java/com/sw/dualscreen/network/api/ApiService.kt +++ b/app/src/main/java/com/sw/dualscreen/network/api/ApiService.kt @@ -4,11 +4,14 @@ import com.sw.dualscreen.GlobalData import com.sw.dualscreen.model.request.UserNutritionParam import com.sw.dualscreen.model.response.ApiResponse import com.sw.dualscreen.model.response.DinnerType +import com.sw.dualscreen.model.response.FaceData import com.sw.dualscreen.model.response.FoodInfo import com.sw.dualscreen.model.response.FoodSearchReq import com.sw.dualscreen.model.response.FoodOrder import com.sw.dualscreen.model.response.MemberInfo +import com.sw.dualscreen.model.response.PayResult import com.sw.dualscreen.model.response.UserFaceModel +import com.sw.dualscreen.model.response.UserNutrition import com.sw.dualscreen.model.response.UserNutritionData import com.sw.dualscreen.objbox.CollectedFoodInfo import okhttp3.MultipartBody @@ -67,6 +70,13 @@ interface ApiService { // @Query("pageSize") pageSize: Int ): ApiResponse> + @GET + suspend fun getUserFaceCache2( + @Url url: String = "http://192.168.1.230:2223/userface/swUserFaceimgSub/list", + @Query("pageNum") pageNum: Int, + @Query("pageSize") pageSize: Int + ): ApiResponse + /** * 获取已采集数据列表 */ @@ -92,17 +102,37 @@ interface ApiService { // @Query("foodName") foodName: String, ): ApiResponse> +// /** +// * 通过用户信息获取就餐数据 +// */ +// @GET +// suspend fun getUserNutritionData( +// @Url url: String = "${GlobalData.appBaseUrl}/zhstapi/zhst/getUserNutritionData/face", +// @Query("appVersion") appVersion: String = GlobalData.appVersion, +// @Query("restId") restId: String, +// @Query("userId") userId: String, +// @Query("foodId") foodId: String, +// ): ApiResponse + /** * 通过用户信息获取就餐数据 */ @GET suspend fun getUserNutritionData( - @Url url: String = "${GlobalData.appBaseUrl}/zhstapi/zhst/getUserNutritionData/face", - @Query("appVersion") appVersion: String = GlobalData.appVersion, - @Query("restId") restId: String, - @Query("userId") userId: String, - @Query("foodId") foodId: String, - ): ApiResponse + @Url url: String = "${GlobalData.appBaseUrl}/terminal/neglect/boothMachine/app/getUserCurrentFoodDetails", + @Query("id") userId: String + ): ApiResponse + + /** + * 获取支付二维码 + */ + @GET + suspend fun getQrCodeImg( + @Url url: String = "${GlobalData.appBaseUrl}/pay/yx-check-out-pay/getQrCodeImg", + @Query("orderNo") orderNo: String, + @Query("memberId") memberId: String?, + @Query("totalFee") totalFee: String? + ): ApiResponse /** * 获取当前餐点类型 @@ -136,6 +166,33 @@ interface ApiService { @Body req: FoodSearchReq ): ApiResponse> + /** + * 查询支付结果 + */ + @POST + suspend fun queryOrderState( + @Url url: String = "${GlobalData.appBaseUrl}/pay/yx-check-out-pay/turnOrderInfo", + @Body param: HashMap + ): ApiResponse + + /** + * 现金支付 + */ + @POST + suspend fun cashPay( + @Url url: String = "${GlobalData.appBaseUrl}/pay/yx-check-out-pay/cashPayment", + @Body param: HashMap + ): ApiResponse + + /** + * 会员支付 + */ + @POST + suspend fun memberPay( + @Url url: String = "${GlobalData.appBaseUrl}/pay/yx-check-out-pay/memberPay", + @Body param: HashMap + ): ApiResponse + /** * 开餐-生成订单 */ diff --git a/app/src/main/java/com/sw/dualscreen/network/interceptor/RequestInterceptor.kt b/app/src/main/java/com/sw/dualscreen/network/interceptor/RequestInterceptor.kt index 3fe4848..f915d87 100644 --- a/app/src/main/java/com/sw/dualscreen/network/interceptor/RequestInterceptor.kt +++ b/app/src/main/java/com/sw/dualscreen/network/interceptor/RequestInterceptor.kt @@ -20,6 +20,7 @@ class RequestInterceptor : Interceptor { .header("Accept", "application/json") // .header("Authorization", "Bearer ${getToken()}") // .header("X-Access-Token", getToken(originalRequest)) + .header("X-Access-Token", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjYW50ZWVuSWQiOiJiZTE1NDgzMS0zNDY2LTNiYTItYTJlYS01NzY1MmM5MTlmZWQiLCJ0eXBlIjoiNCIsInVzZXJJZCI6IjAwMDAwMDAwMDAwMDAwMDAwMDEifQ.sN40cOC-O5WQFrF4IDUs8fFlkNdUKLbJt_rHyTsgYYM") // .header("X-DEVICE-CODE", "bcf396ed-78f6-3864-9837-7c37c5b2ec41") .header("X-DEVICE-CODE", GlobalData.deviceId) .header("authorization", "57ee87183f2a4fa59683ec9ef41c8f5d") diff --git a/app/src/main/java/com/sw/dualscreen/presentation/MainScreenPresentation.kt b/app/src/main/java/com/sw/dualscreen/presentation/MainScreenPresentation.kt index 4c8b092..030ae2c 100644 --- a/app/src/main/java/com/sw/dualscreen/presentation/MainScreenPresentation.kt +++ b/app/src/main/java/com/sw/dualscreen/presentation/MainScreenPresentation.kt @@ -21,6 +21,7 @@ import androidx.lifecycle.Observer import androidx.lifecycle.lifecycleScope import com.arcsoft.face.ErrorInfo import com.sw.dualscreen.GlobalKey +import com.sw.dualscreen.MyApp import com.sw.dualscreen.R import com.sw.dualscreen.activity.MainActivity import com.sw.dualscreen.databinding.PresentationMainScreenBinding @@ -33,6 +34,7 @@ import com.sw.dualscreen.ext.visible import com.sw.dualscreen.model.request.UserNutritionParam import com.sw.dualscreen.model.response.DinnerType import com.sw.dualscreen.model.response.FoodInfo +import com.sw.dualscreen.model.response.UserNutrition import com.sw.dualscreen.model.response.UserNutritionData import com.sw.dualscreen.utils.Debouncer import com.sw.dualscreen.utils.SPUtil @@ -90,7 +92,9 @@ class MainScreenPresentation( private var detectWeight = 0.0 //识别菜品时的重量 private var lastWeight = 0.0 // 上一次的计算热量结果 - private var userNutritionData: UserNutritionData? = null + + // private var userNutritionData: UserNutritionData? = null + private var userNutrition: UserNutrition? = null private var dinnerTypeInfo: DinnerType? = null private val debouncer = Debouncer(500) private var recognitionTime: Long = 0L // 人脸识别时的时间 @@ -140,7 +144,8 @@ class MainScreenPresentation( return } - if (userNutritionData == null) { + //if (userNutritionData == null) { + if (userNutrition == null) { Timber.tag(TAG).e("updateWeight userNutritionData is null") return } @@ -206,17 +211,17 @@ class MainScreenPresentation( } } } - activity.lifecycleScope.launch { - userViewModel.nutritionData.collect { - Timber.tag(TAG).d("registerDataChange nutritionData = $it") - userNutritionData = it - if (it == null) return@collect -// step3ShowRecognizeResult() +// activity.lifecycleScope.launch { +// userViewModel.nutritionData.collect { +// Timber.tag(TAG).d("registerDataChange nutritionData = $it") +// userNutritionData = it +// if (it == null) return@collect +//// step3ShowRecognizeResult() // //binding.nutritionInclude.tvUserName.text = it.userName.maskName() // //binding.nutritionInclude.tvRecommendHeat.text = "推荐热量:${it.recommendMin}-${it.recommendMax}" -// //updateWeight(lastWeight / 1000) - } - } +//// //updateWeight(lastWeight / 1000) +// } +// } activity.lifecycleScope.launch { userViewModel.dinnerTypeInfo.drop(1).collect { Timber.tag(TAG).d("registerDataChange dinnerTypeInfo = $it") @@ -291,16 +296,16 @@ class MainScreenPresentation( // Timber.tag(TAG).d("loadBilledMode:${GsonUtils.toJson(it)}") // } currentFood?.let { - val specPrice = it.specPrice?:0.0 - val vipPrice = it.vipPrice?:0.0 + val specPrice = it.specPrice ?: 0.0 + val vipPrice = it.vipPrice ?: 0.0 binding.tvNormalPrice.text = "${specPrice.format2String(2)} 元/份" binding.tvVipPrice.text = "${vipPrice.format2String(2)} 元/份" var calorie = getIntNutritionValue(it.calorie) calorie = max(calorie, 0) - val fat = getIntNutritionValue(it.fat) - val protein = getIntNutritionValue(it.protein) - val carbohydrate = getIntNutritionValue(it.carbohydrate) + val fat = getIntNutritionValue(it.fat) + val protein = getIntNutritionValue(it.protein) + val carbohydrate = getIntNutritionValue(it.carbohydrate) val fatRate = getNutritionRate(fat, calorie) val proteinRate = getNutritionRate(protein, calorie) @@ -311,26 +316,33 @@ class MainScreenPresentation( tvProteinRate.text = "$proteinRate%" tvCarbohydrateRate.text = "$carbohydrateRate%" - viewFatLine.updateLayoutParams { height = (fatRate/100.0*84).roundToInt()*1.dp } - viewProteinLine.updateLayoutParams { height = (proteinRate/100.0*84).roundToInt()*1.dp } - viewCarbohydrateLine.updateLayoutParams { height = (carbohydrateRate/100.0*84).roundToInt()*1.dp } + viewFatLine.updateLayoutParams { + height = (fatRate / 100.0 * 84).roundToInt() * 1.dp + } + viewProteinLine.updateLayoutParams { + height = (proteinRate / 100.0 * 84).roundToInt() * 1.dp + } + viewCarbohydrateLine.updateLayoutParams { + height = (carbohydrateRate / 100.0 * 84).roundToInt() * 1.dp + } } } } - private fun getNutritionRate(value: Int, total: Int): Int{ + private fun getNutritionRate(value: Int, total: Int): Int { if (value == 0 || total == 0) return 0 return (100.0 * value / total).roundToInt() } - private fun getIntNutritionValue(text: String?): Int { - return if (text.isNullOrBlank()) 0 else text.toFloat().roundToInt() } + private fun getIntNutritionValue(num: Double?): Int { + return num?.roundToInt() ?: 0 + } /** * 餐品识别成功,不计费模式 */ - fun loadUnbilledMode() { + fun loadUnbilledMode(nutrition: UserNutrition) { binding.calorieInclude.root.gone() binding.nutritionInclude.root.visible() @@ -342,12 +354,13 @@ class MainScreenPresentation( //binding.ivRecImage.gone() //updateFoodInfo(foodInfo) - userNutritionData?.let { - binding.nutritionInclude.tvUserName.text = it.userName.maskName() - binding.nutritionInclude.tvRecommendHeat.text = - "推荐热量:${it.recommendMin}-${it.recommendMax}kcal" - updateWeight(lastWeight / 1000) - } + binding.nutritionInclude.tvUserName.text = nutrition.name.maskName() + binding.nutritionInclude.tvRecommendHeat.text = + "推荐热量:${nutrition.recommendEnergy ?: 0}kcal" + //updateWeight(lastWeight / 1000) +// ------------------------------------------------- +// 删除userNutritionData,改为userNutrition + calculateNutrition(recognitionWeight - lastWeight) } /** @@ -370,7 +383,8 @@ class MainScreenPresentation( dinnerTypeInfo = null currentFood = null - userNutritionData = null +// userNutritionData = null + userNutrition = null recognitionWeight = 0.0 stepChangeCallback(currentStep) @@ -434,7 +448,8 @@ class MainScreenPresentation( binding.ivPreviewImage.gone() dinnerTypeInfo = null - userNutritionData = null +// userNutritionData = null + userNutrition = null recognitionWeight = 0.0 stepChangeCallback(currentStep) @@ -457,7 +472,8 @@ class MainScreenPresentation( binding.ivPreviewImage.gone() binding.ivRecImage.let { it.visible() - val imageUrl = if (foodInfo.foodImg.isNullOrBlank()) foodInfo.photoUri else foodInfo.foodImg + val imageUrl = + if (foodInfo.foodImg.isNullOrBlank()) foodInfo.photoUri else foodInfo.foodImg it.load(imageUrl) } val mode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0) @@ -506,11 +522,12 @@ class MainScreenPresentation( Timber.tag(TAG) .d("calculateNutrition weight = $weight, recognitionWeight = $recognitionWeight") val dinnerType = dinnerTypeInfo!!.dinnerType!! - Timber.tag(TAG) - .d("calculateNutrition foodName = ${currentFood!!.foodName}, dinnerType = $dinnerType, userId = ${userNutritionData!!.userId}") - val calcResultInfo = UserNutritionUtils.calculateNutrition( +// Timber.tag(TAG) +// .d("calculateNutrition foodName = ${currentFood!!.foodName}, dinnerType = $dinnerType, userId = ${userNutritionData!!.userId}") + val calcResultInfo = UserNutritionUtils.calculateNutrition2( currentFood!!, - userNutritionData!!, +// userNutritionData!!, + userNutrition!!, weight, dinnerType = dinnerType ) @@ -701,6 +718,7 @@ class MainScreenPresentation( val faceEntity = compareResult.faceEntity val userId = faceEntity.userName if (userId == null) return@Observer + ToastUtils.showToast("人脸识别成功,userId = $userId") if (currentFood == null) { currentFood = activity.checkedItem } @@ -710,17 +728,19 @@ class MainScreenPresentation( return@runOnUiThread } } - // TODO: ------------------人脸识别成功 - //------------------------------------------------- - // TODO: ------------------人脸识别成功 - step3ShowRecognizeResult() //根据接口数据更新热量数据-------------------------- - loadUnbilledMode() -// userViewModel.getUserNutritionData( -// userId = userId, -// foodId = currentFood!!.foodId!! -// ) + userViewModel.getUserNutritionData(userId = userId) { nutrition -> + activity.runOnUiThread { + if (nutrition == null) { + ToastUtils.showToast("未查询到营养数据") + return@runOnUiThread + } + this@MainScreenPresentation.userNutrition = nutrition + loadUnbilledMode(nutrition) +// ------------------------------- + } + } }) recognizeViewModel.drawRectInfoText.observe(activity, Observer { info -> @@ -1013,7 +1033,8 @@ class MainScreenPresentation( } val listIsEmpty = facePreviewInfoList.isEmpty() val listFirstTrackId = if (listIsEmpty.not()) facePreviewInfoList[0]!!.trackId else null - Timber.tag(TAG).d("listIsEmpty=$listIsEmpty,lastFaceTrackId=$lastFaceTrackId,listFirstTrackId=$listFirstTrackId") + Timber.tag(TAG) + .d("listIsEmpty=$listIsEmpty,lastFaceTrackId=$lastFaceTrackId,listFirstTrackId=$listFirstTrackId") if (listIsEmpty || (lastFaceTrackId != listFirstTrackId)) { if (lastFaceTrackId != -1) { mealPickupMode = SPUtil.getInstance().get(GlobalKey.KEY_PICKUP_MODE, 0) ?: 0 @@ -1032,9 +1053,9 @@ class MainScreenPresentation( fun postUserData() { Timber.tag(TAG).d("postUserData") - if (userNutritionData == null || currentFood == null) { + if (userNutrition == null || currentFood == null) { Timber.tag(TAG) - .d("postUserData userNutritionData = ${userNutritionData == null}, currentFood = ${currentFood == null}") + .d("postUserData userNutritionData = ${userNutrition == null}, currentFood = ${currentFood == null}") return } var eatWeight = 0.0 @@ -1044,14 +1065,23 @@ class MainScreenPresentation( } else { recognitionWeight - lastWeight } - val userNutritionParam = UserNutritionParam( - userId = userNutritionData?.userId!!, - foodId = currentFood?.foodId!!, - faceTime = recognitionTime, - faceEndTime = System.currentTimeMillis(), - eatWeight = eatWeight,//lastWeight - foodWeight = lastWeight - ) - userViewModel.postUserNutritionData(listOf(userNutritionParam)) + //val userNutritionParam = UserNutritionParam( + // userId = userNutritionData?.userId!!, + // foodId = currentFood?.foodId!!, + // faceTime = recognitionTime, + // faceEndTime = System.currentTimeMillis(), + // eatWeight = eatWeight,//lastWeight + // foodWeight = lastWeight + //) + //userViewModel.postUserNutritionData(listOf(userNutritionParam)) + activity.createOrder( + foodInfo = currentFood!!, + foodWeight = lastWeight.roundToInt(), + eatWeight = eatWeight.roundToInt() + ) { + if (MyApp.DEBUG) { + ToastUtils.showToast("订单已生成") + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/sw/dualscreen/presentation/UserNutritionUtils.kt b/app/src/main/java/com/sw/dualscreen/presentation/UserNutritionUtils.kt index 35f0ad3..074847f 100644 --- a/app/src/main/java/com/sw/dualscreen/presentation/UserNutritionUtils.kt +++ b/app/src/main/java/com/sw/dualscreen/presentation/UserNutritionUtils.kt @@ -4,6 +4,7 @@ package com.sw.dualscreen.presentation import android.text.TextUtils import com.sw.dualscreen.ext.toSafeDouble import com.sw.dualscreen.model.response.FoodInfo +import com.sw.dualscreen.model.response.UserNutrition import com.sw.dualscreen.model.response.UserNutritionData import timber.log.Timber import kotlin.math.max @@ -16,62 +17,109 @@ object UserNutritionUtils { /** * 计算热量信息 */ - fun calculateNutrition( + fun calculateNutrition2( foodInfo: FoodInfo, - userModel: UserNutritionData, + nutrition: UserNutrition, weight: Double, dinnerType: String ): CalcResultInfo { - // 初始化变量 - var foodKcal = 0.0 var totalKcal = 0.0 - var (vegetable, meat, fruits, grain) = List(4) { 0.0 } + var (calorie, grain, fruitsVegetables, meatEggs) = List(4) { 0.0 } // 处理食物信息 - foodKcal = calculateValue(foodInfo.stFoodInfoMaterial?.energyKcal, weight) - Timber.d("calculateNutrition foodKcal = ${foodKcal}, energyKcal = ${foodInfo.stFoodInfoMaterial?.energyKcal}, weight = $weight") - grain = calculateValue(foodInfo.stFoodInfoPagodaAPPVO?.grainValue(), weight) - fruits = calculateValue(foodInfo.stFoodInfoPagodaAPPVO?.fruitsValue(), weight) - vegetable = calculateValue(foodInfo.stFoodInfoPagodaAPPVO?.vegetableValue(), weight) - meat = calculateValue(foodInfo.stFoodInfoPagodaAPPVO?.meatValue(), weight) + calorie = calculateValue(foodInfo.calorie, weight) + grain = calculateValue(foodInfo.stapleFood, weight) + fruitsVegetables = calculateValue(foodInfo.fruitsVegetables, weight) + meatEggs = calculateValue(foodInfo.meatEggs, weight) // 合并用户数据 - grain += userModel.stFoodInfoPagoda?.grainValue() ?: 0.0 + calorie += nutrition.calorie ?: 0.0 + grain += nutrition.stapleFood ?: 0.0 + fruitsVegetables += nutrition.fruitsVegetables ?: 0.0 + meatEggs += nutrition.meatEggs ?: 0.0 - fruits += userModel.stFoodInfoPagoda?.fruitsValue() ?: 0.0 - vegetable = vegetable.plus(userModel.stFoodInfoPagoda?.vegetableValue() ?: 0.0) - meat += userModel.stFoodInfoPagoda?.meatValue() ?: 0.0 - - totalKcal = foodKcal + userModel.energyValue() - Timber.d("calculateNutrition totalKcal = ${totalKcal}, energyValue = ${userModel.energyValue()}") - if (totalKcal < 0){ - totalKcal = 0.0 - } + totalKcal = max(calorie, 0.0) // 判断当餐最大热量 - val maxKcal = - userModel.totalEnergyCalculateScoreValue() * calculateDinnerTypeRatio(dinnerType) / 10 - Timber.d("calculateNutrition maxKcal = ${maxKcal}, CalculateScoreValue = ${userModel.totalEnergyCalculateScoreValue()}") - val pagoda = userModel.stFoodInfoPagoda - val fruitsInfo = parseRecommend(pagoda?.fruitsRecommend, fruits) - val vegetableInfo = parseRecommend(pagoda?.vegetableRecommend, vegetable) + //val maxKcal = userModel.totalEnergyCalculateScoreValue() * calculateDinnerTypeRatio(dinnerType) / 10 + //Timber.d("calculateNutrition maxKcal = ${maxKcal}, CalculateScoreValue = ${userModel.totalEnergyCalculateScoreValue()}") + // TODO: 测试数据------------------------------- + val rate = calculateDinnerTypeRatio(dinnerType) / 10.0 + val maxKcal = totalKcal/ 0.26 / rate + val grainRecommend = "0-100" + val meatRecommend = "0-100" + val fruitsRecommend = "0-100" + // TODO: 测试数据------------------------------- val calcResult = CalcResultInfo( totalKcal = CalcInfo( max = maxKcal, min = 0.0, current = totalKcal ), - grain = parseRecommend(pagoda?.grainRecommend, grain), - fruits = CalcInfo( // 果蔬 = 水果+蔬菜 - max = fruitsInfo.max + vegetableInfo.max, - min = fruitsInfo.min + vegetableInfo.min, - current = fruitsInfo.current + vegetableInfo.current - ), - meat = parseRecommend(pagoda?.meatRecommend, meat) + grain = parseRecommend(grainRecommend, grain), + fruits = parseRecommend(fruitsRecommend, fruitsVegetables), + meat = parseRecommend(meatRecommend, meatEggs) ) return calcResult } +// fun calculateNutrition( +// foodInfo: FoodInfo, +// userModel: UserNutritionData, +//// userModel: UserNutrition, +// weight: Double, +// dinnerType: String +// ): CalcResultInfo { +// +// // 初始化变量 +// var foodKcal = 0.0 +// var totalKcal = 0.0 +// var (vegetable, meat, fruits, grain) = List(4) { 0.0 } +// +// // 处理食物信息 +// foodKcal = calculateValue(foodInfo.stFoodInfoMaterial?.energyKcal, weight) +// Timber.d("calculateNutrition foodKcal = ${foodKcal}, energyKcal = ${foodInfo.stFoodInfoMaterial?.energyKcal}, weight = $weight") +// grain = calculateValue(foodInfo.stFoodInfoPagodaAPPVO?.grainValue(), weight) +// fruits = calculateValue(foodInfo.stFoodInfoPagodaAPPVO?.fruitsValue(), weight) +// vegetable = calculateValue(foodInfo.stFoodInfoPagodaAPPVO?.vegetableValue(), weight) +// meat = calculateValue(foodInfo.stFoodInfoPagodaAPPVO?.meatValue(), weight) +// +// // 合并用户数据 +// grain += userModel.stFoodInfoPagoda?.grainValue() ?: 0.0 +// +// fruits += userModel.stFoodInfoPagoda?.fruitsValue() ?: 0.0 +// vegetable = vegetable.plus(userModel.stFoodInfoPagoda?.vegetableValue() ?: 0.0) +// meat += userModel.stFoodInfoPagoda?.meatValue() ?: 0.0 +// +// totalKcal = foodKcal + userModel.energyValue() +// Timber.d("calculateNutrition totalKcal = ${totalKcal}, energyValue = ${userModel.energyValue()}") +// if (totalKcal < 0) { +// totalKcal = 0.0 +// } +// // 判断当餐最大热量 +// val maxKcal = +// userModel.totalEnergyCalculateScoreValue() * calculateDinnerTypeRatio(dinnerType) / 10 +// Timber.d("calculateNutrition maxKcal = ${maxKcal}, CalculateScoreValue = ${userModel.totalEnergyCalculateScoreValue()}") +// val pagoda = userModel.stFoodInfoPagoda +// val fruitsInfo = parseRecommend(pagoda?.fruitsRecommend, fruits) +// val vegetableInfo = parseRecommend(pagoda?.vegetableRecommend, vegetable) +// val calcResult = CalcResultInfo( +// totalKcal = CalcInfo( +// max = maxKcal, +// min = 0.0, +// current = totalKcal +// ), +// grain = parseRecommend(pagoda?.grainRecommend, grain), +// fruits = CalcInfo( // 果蔬 = 水果+蔬菜 +// max = fruitsInfo.max + vegetableInfo.max, +// min = fruitsInfo.min + vegetableInfo.min, +// current = fruitsInfo.current + vegetableInfo.current +// ), +// meat = parseRecommend(pagoda?.meatRecommend, meat) +// ) +// return calcResult +// } + fun parseRecommend(recommend: String?, current: Double): CalcInfo { var newCurrent = if (current < 0) 0.0 else current if (TextUtils.isEmpty(recommend) || !recommend!!.contains("-")) { diff --git a/app/src/main/java/com/sw/dualscreen/presentation/pay/FacePayPresentation.kt b/app/src/main/java/com/sw/dualscreen/presentation/pay/FacePayPresentation.kt index b720d3e..0ffadf7 100644 --- a/app/src/main/java/com/sw/dualscreen/presentation/pay/FacePayPresentation.kt +++ b/app/src/main/java/com/sw/dualscreen/presentation/pay/FacePayPresentation.kt @@ -29,8 +29,12 @@ import com.arcsoft.face.ErrorInfo import com.sw.dualscreen.R import com.sw.dualscreen.activity.PayActivity import com.sw.dualscreen.databinding.PresentationFacePayBinding +import com.sw.dualscreen.ext.format2String import com.sw.dualscreen.ext.load +import com.sw.dualscreen.model.response.MemberInfo +import com.sw.dualscreen.model.response.TextBean import com.sw.dualscreen.utils.GsonUtils +import com.sw.dualscreen.utils.SpannedUtils import com.sw.dualscreen.view.CustomDialog import com.sw.dualscreen.viewmodel.UserViewModel import com.sw.plate.utils.ToastUtils @@ -57,7 +61,7 @@ class FacePayPresentation( val recognizeViewModel: RecognizeViewModel, // val //parentTextureView: TextureView, private val onDismissListener: () -> Unit = {} -) : Presentation(activity, display) , ViewTreeObserver.OnGlobalLayoutListener { +) : Presentation(activity, display), ViewTreeObserver.OnGlobalLayoutListener { companion object { private const val TAG = "FacePayPresentation" @@ -99,7 +103,12 @@ class FacePayPresentation( var payAmount: String? = null private fun initView() { binding.tvFoodName.text = foodName - binding.tvRealAmount.text = getAmountText(payAmount ?: "") + binding.tvRealAmount.text = SpannedUtils.getAmountText( + listOf( + TextBean(text = "¥", textSize = 32), + TextBean(text = payAmount ?: "", textSize = 48), + ) + ) // binding.ivPreviewImage.let { // it.outlineProvider = object : ViewOutlineProvider() { // override fun getOutline(view: View, outline: Outline) { @@ -110,19 +119,13 @@ class FacePayPresentation( // } } - private fun getAmountText(amount: String): SpannedString { - return buildSpannedString { - append("¥", AbsoluteSizeSpan(32, true), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) - append(amount, AbsoluteSizeSpan(48, true), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) - } - } - override fun onGlobalLayout() { Timber.tag(TAG).d("onGlobalLayout") binding.dualCameraTexturePreviewRgb.getViewTreeObserver().removeOnGlobalLayoutListener(this) //parentTextureView.getViewTreeObserver().removeOnGlobalLayoutListener(this) openCamera() } + private fun openCamera() { Timber.tag(TAG).d("openCamera") if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != @@ -168,33 +171,13 @@ class FacePayPresentation( } } } -// activity.lifecycleScope.launch { -// userViewModel.nutritionData.collect { -// Timber.tag(TAG).d("registerDataChange nutritionData = $it") -// userNutritionData = it -// if (it == null) return@collect -// step3ShowRecognizeResult() -// //binding.nutritionInclude.tvUserName.text = it.userName.maskName() -// //binding.nutritionInclude.tvRecommendHeat.text = "推荐热量:${it.recommendMin}-${it.recommendMax}" -// //updateWeight(lastWeight / 1000) -// } -// } -// activity.lifecycleScope.launch { -// userViewModel.dinnerTypeInfo.drop(1).collect { -// Timber.tag(TAG).d("registerDataChange dinnerTypeInfo = $it") -// dinnerTypeInfo = it -// } -// } } + override fun onStop() { - if (rgbCameraHelper != null) { - rgbCameraHelper!!.release() - rgbCameraHelper = null - } - if (irCameraHelper != null) { - irCameraHelper!!.release() - irCameraHelper = null - } + rgbCameraHelper?.release() + rgbCameraHelper = null + irCameraHelper?.release() + irCameraHelper = null recognizeViewModel.destroy() super.onStop() } @@ -202,8 +185,8 @@ class FacePayPresentation( fun resumeCamera() { Timber.tag(TAG).d("resumeCamera isRecognition = $isRecognition") isRecognition = true - if (rgbCameraHelper != null && rgbCameraHelper!!.isStopped) { - rgbCameraHelper!!.start() + if (rgbCameraHelper?.isStopped == true) { + rgbCameraHelper?.start() } } @@ -249,7 +232,8 @@ class FacePayPresentation( recognizeViewModel.recognizeConfiguration .observe(activity, Observer { recognizeConfiguration: RecognizeConfiguration? -> - Timber.tag(TAG).i("recognizeConfiguration: observe = ${recognizeConfiguration.toString()}") + Timber.tag(TAG) + .i("recognizeConfiguration: observe = ${recognizeConfiguration.toString()}") }) recognizeViewModel.recognizeNotice.observe(activity, Observer { notice: String? -> Timber.tag(TAG).i("recognizeNotice observe notice = $notice") @@ -258,45 +242,15 @@ class FacePayPresentation( recognizeViewModel.recognizeUserId.observe( activity, Observer { compareResult: CompareResult -> - Timber.tag(TAG).i("recognizeUserId observe compareResult = ${compareResult.trackId}, userId = ${compareResult.faceEntity.userName}") + Timber.tag(TAG) + .i("recognizeUserId observe compareResult = ${compareResult.trackId}, userId = ${compareResult.faceEntity.userName}") // recognitionTime = System.currentTimeMillis() // recognitionWeight = lastWeight lastFaceTrackId = compareResult.trackId val faceEntity = compareResult.faceEntity val userId = faceEntity.userName - if (userId == null ) return@Observer - activity.runOnUiThread { - //ToastUtils.showToast("用户人脸识别成功,挑战支付页面") - showWaitingDialog("刷脸支付中,请稍后……") - userViewModel.getMemberInfo(memberId = userId) { memberInfo -> - activity.runOnUiThread { - if (memberInfo == null) { - ToastUtils.showToast("查询会员信息失败,请稍后重试") - return@runOnUiThread - } - userViewModel.bindOrder(userId, activity.foodOrderId) { bindResult -> - activity.runOnUiThread { - if (bindResult.not()) { - hideWaitingDialog() - ToastUtils.showToast("订单绑定失败") - return@runOnUiThread - } - binding.root.postDelayed({ - hideWaitingDialog() - activity.showPayInfo(memberInfo) - binding.root.postDelayed({ - dismiss() - },500) - },1500) - } - } - } - } - } -// userViewModel.getUserNutritionData( -// userId = userId, -// foodId = currentFood!!.id!! -// ) + if (userId == null) return@Observer + faceRecSuccess(userId) }) recognizeViewModel.drawRectInfoText.observe(activity, Observer { info -> @@ -388,7 +342,8 @@ class FacePayPresentation( displayOrientation: Int, isMirror: Boolean ) { - Timber.tag(TAG).d("initRgbCamera Rgb onCameraOpened: cameraId = $cameraId, displayOrientation = $displayOrientation") + Timber.tag(TAG) + .d("initRgbCamera Rgb onCameraOpened: cameraId = $cameraId, displayOrientation = $displayOrientation") activity.runOnUiThread({ val previewSizeRgb = camera.getParameters().getPreviewSize() val layoutParams = adjustPreviewViewSize( @@ -397,8 +352,10 @@ class FacePayPresentation( previewSizeRgb, displayOrientation, 0.6F ) - Timber.tag(TAG).d("initRgbCamera previewSizeRgb = ${previewSizeRgb.width}-${previewSizeRgb.height}") - Timber.tag(TAG).d("initRgbCamera layoutParams = ${layoutParams.width}-${layoutParams.height}") + Timber.tag(TAG) + .d("initRgbCamera previewSizeRgb = ${previewSizeRgb.width}-${previewSizeRgb.height}") + Timber.tag(TAG) + .d("initRgbCamera layoutParams = ${layoutParams.width}-${layoutParams.height}") Timber.tag(TAG).d( "initRgbCamera isMirror = ${isMirror}, isDrawRgbRectHorizontalMirror = ${ ConfigUtil.isDrawRgbRectHorizontalMirror( @@ -454,16 +411,19 @@ class FacePayPresentation( } override fun onCameraConfigurationChanged(cameraID: Int, displayOrientation: Int) { - Timber.tag(TAG).i("initRgbCamera onCameraConfigurationChanged: threadName = ${Thread.currentThread().name}") + Timber.tag(TAG) + .i("initRgbCamera onCameraConfigurationChanged: threadName = ${Thread.currentThread().name}") if (rgbFaceRectTransformer != null) { rgbFaceRectTransformer!!.cameraDisplayOrientation = displayOrientation } - Timber.tag(TAG).i("initRgbCamera onCameraConfigurationChanged: $cameraID $displayOrientation") + Timber.tag(TAG) + .i("initRgbCamera onCameraConfigurationChanged: $cameraID $displayOrientation") } } val measuredWidth = binding.dualCameraTexturePreviewRgb.measuredWidth - val measuredHeight = binding.dualCameraTexturePreviewRgb.measuredHeight - Timber.tag(TAG).i("initRgbCamera measuredWidth=$measuredWidth,measuredHeight=$measuredHeight") + val measuredHeight = binding.dualCameraTexturePreviewRgb.measuredHeight + Timber.tag(TAG) + .i("initRgbCamera measuredWidth=$measuredWidth,measuredHeight=$measuredHeight") val previewConfig: PreviewConfig = recognizeViewModel.previewConfig rgbCameraHelper = DualCameraHelper.Builder() @@ -498,7 +458,8 @@ class FacePayPresentation( displayOrientation: Int, isMirror: Boolean ) { - Timber.tag(TAG).d("initIrCamera IR onCameraOpened: cameraId = $cameraId, displayOrientation = $displayOrientation") + Timber.tag(TAG) + .d("initIrCamera IR onCameraOpened: cameraId = $cameraId, displayOrientation = $displayOrientation") val previewSizeIr = camera.getParameters().getPreviewSize() val layoutParams = adjustPreviewViewSize( binding.dualCameraTexturePreviewRgb, @@ -539,7 +500,8 @@ class FacePayPresentation( if (irFaceRectTransformer != null) { irFaceRectTransformer!!.cameraDisplayOrientation = displayOrientation } - Timber.tag(TAG).i("initIrCamera onCameraConfigurationChanged: cameraID = $cameraID, displayOrientation = $displayOrientation") + Timber.tag(TAG) + .i("initIrCamera onCameraConfigurationChanged: cameraID = $cameraID, displayOrientation = $displayOrientation") } } @@ -586,22 +548,24 @@ class FacePayPresentation( if (facePreviewInfoList.isEmpty() || (lastFaceTrackId != facePreviewInfoList[0]!!.trackId)) { if (lastFaceTrackId != -1) { - // mealPickupMode = SPUtil.getInstance().get(GlobalKey.KEY_PICKUP_MODE, 0) ?: 0 - // Timber.tag(TAG).i("$lastFaceTrackId 用户离开") - // lastFaceTrackId = -1 - // postUserData() - // if (mealPickupMode == 0) { - // step1FoodRecognizing() - // } else { - // step2FaceRecognizing(currentFood!!) - // } + // mealPickupMode = SPUtil.getInstance().get(GlobalKey.KEY_PICKUP_MODE, 0) ?: 0 + // Timber.tag(TAG).i("$lastFaceTrackId 用户离开") + // lastFaceTrackId = -1 + // postUserData() + // if (mealPickupMode == 0) { + // step1FoodRecognizing() + // } else { + // step2FaceRecognizing(currentFood!!) + // } resumeCamera() } } } + private var lastFaceTrackId: Int = -1 // 上一次的人脸信息 - private var mDialogWaiting:CustomDialog?=null + private var mDialogWaiting: CustomDialog? = null + /** * 显示等待提示框 */ @@ -627,4 +591,49 @@ class FacePayPresentation( super.onDisplayRemoved() onDismissListener() } + + private fun faceRecSuccess(userId: String) { + activity.runOnUiThread { + showWaitingDialog("加载中,请稍后……") + } + getMemberInfo(userId) { memberInfo -> + bindOrder(userId) { + binding.root.postDelayed({ + hideWaitingDialog() + activity.showPayInfo(type = 1, isVip = true, memberInfo = memberInfo) + binding.root.postDelayed({ + dismiss() + }, 500) + }, 1500) + } + } + } + + private fun bindOrder(userId:String, block:()-> Unit) { + userViewModel.bindOrder(userId, activity.foodOrderId) { bindResult -> + activity.runOnUiThread { + if (bindResult.not()) { + hideWaitingDialog() + ToastUtils.showToast("订单绑定失败") + return@runOnUiThread + } + block() + } + } + } + + private fun getMemberInfo(userId: String, block:(MemberInfo)-> Unit) { + userViewModel.getMemberInfo(memberId = userId) { memberInfo -> + activity.runOnUiThread { + if (memberInfo == null) { + hideWaitingDialog() + ToastUtils.showToast("查询会员信息失败,请稍后重试") + return@runOnUiThread + } + block(memberInfo) + } + } + } + + } \ No newline at end of file diff --git a/app/src/main/java/com/sw/dualscreen/repository/RemoteRepository.kt b/app/src/main/java/com/sw/dualscreen/repository/RemoteRepository.kt index 5483578..e0529a5 100644 --- a/app/src/main/java/com/sw/dualscreen/repository/RemoteRepository.kt +++ b/app/src/main/java/com/sw/dualscreen/repository/RemoteRepository.kt @@ -4,11 +4,14 @@ import com.sw.dualscreen.GlobalData import com.sw.dualscreen.model.request.UserNutritionParam import com.sw.dualscreen.model.response.ApiResponse import com.sw.dualscreen.model.response.DinnerType +import com.sw.dualscreen.model.response.FaceData import com.sw.dualscreen.model.response.FoodInfo import com.sw.dualscreen.model.response.FoodSearchReq import com.sw.dualscreen.model.response.FoodOrder import com.sw.dualscreen.model.response.MemberInfo +import com.sw.dualscreen.model.response.PayResult import com.sw.dualscreen.model.response.UserFaceModel +import com.sw.dualscreen.model.response.UserNutrition import com.sw.dualscreen.model.response.UserNutritionData import com.sw.dualscreen.network.api.ApiService import com.sw.dualscreen.objbox.CollectedFoodInfo @@ -73,6 +76,18 @@ class RemoteRepository constructor( } } + suspend fun getUserFaceCache2( + pageNum: Int, + pageSize: Int = 160, + ): ApiResponse { + return safeApiCall { + apiService.getUserFaceCache2( + pageNum = pageNum, + pageSize = pageSize + ) + } + } + /** * 获取人脸数据 */ @@ -107,16 +122,38 @@ class RemoteRepository constructor( } } +// /** +// * 通过用户信息获取就餐数据 +// */ +// suspend fun getUserNutritionData( +// restId: String = GlobalData.restId, +// userId: String, +// foodId: String, +// ): ApiResponse { +// return safeApiCall { +// apiService.getUserNutritionData(restId = restId, userId = userId, foodId = foodId) +// } +// } + /** * 通过用户信息获取就餐数据 */ - suspend fun getUserNutritionData( - restId: String = GlobalData.restId, - userId: String, - foodId: String, - ): ApiResponse { + suspend fun getUserNutritionData(userId: String): ApiResponse { return safeApiCall { - apiService.getUserNutritionData(restId = restId, userId = userId, foodId = foodId) + apiService.getUserNutritionData(userId = userId) + } + } + + /** + * 获取支付二维码 + */ + suspend fun getQrCodeImg( + orderNo: String, + memberId: String? = null, + totalFee: String? = null + ): ApiResponse { + return safeApiCall { + apiService.getQrCodeImg(orderNo = orderNo, memberId = memberId, totalFee = totalFee) } } @@ -150,12 +187,42 @@ class RemoteRepository constructor( } } + /** + * 创建订单 + */ suspend fun createOrder(order: FoodOrder): ApiResponse { return safeApiCall { apiService.createOrder(order = order) } } + /** + * 现金支付 + */ + suspend fun cashPay(param: HashMap): ApiResponse { + return safeApiCall { + apiService.cashPay(param = param) + } + } + + /** + * 查询订单状态 + */ + suspend fun queryOrderState(param: HashMap): ApiResponse { + return safeApiCall { + apiService.queryOrderState(param = param) + } + } + + /** + * 会员支付 + */ + suspend fun memberPay(param: HashMap): ApiResponse { + return safeApiCall { + apiService.memberPay(param = param) + } + } + suspend fun bindOrder(userId: String, orderId: String): ApiResponse { return safeApiCall { apiService.bindOrder(userId = userId, orderId = orderId) diff --git a/app/src/main/java/com/sw/dualscreen/utils/SpannedUtils.kt b/app/src/main/java/com/sw/dualscreen/utils/SpannedUtils.kt index 1f2523f..ab1fa40 100644 --- a/app/src/main/java/com/sw/dualscreen/utils/SpannedUtils.kt +++ b/app/src/main/java/com/sw/dualscreen/utils/SpannedUtils.kt @@ -10,20 +10,19 @@ import com.sw.dualscreen.model.response.TextBean object SpannedUtils { + const val SPAN_FLAGS = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE + public fun getAmountText(list: List): SpannedString { return buildSpannedString { list.forEach { - append( - it.text, - AbsoluteSizeSpan(it.textSize, true), - Spanned.SPAN_EXCLUSIVE_EXCLUSIVE - ) + val start = length + append(it.text) + val end = length + if (it.textSize != 0) { + setSpan(AbsoluteSizeSpan(it.textSize, true), start, end, SPAN_FLAGS) + } if (it.textColor.isNullOrBlank().not()) { - append( - it.text, - ForegroundColorSpan(it.textColor!!.toColorInt()), - Spanned.SPAN_EXCLUSIVE_EXCLUSIVE - ) + setSpan(ForegroundColorSpan(it.textColor!!.toColorInt()), start, end, SPAN_FLAGS) } } } diff --git a/app/src/main/java/com/sw/dualscreen/viewmodel/BaseViewModel.kt b/app/src/main/java/com/sw/dualscreen/viewmodel/BaseViewModel.kt index 1f45d68..cda2be4 100644 --- a/app/src/main/java/com/sw/dualscreen/viewmodel/BaseViewModel.kt +++ b/app/src/main/java/com/sw/dualscreen/viewmodel/BaseViewModel.kt @@ -56,7 +56,7 @@ abstract class BaseViewModel() : ViewModel() { if (code == "00000" || code == "200" || code == "0") { return true } - val message = response.message?:response.msg + val message = response.msg Timber.d("msg = ${message}, code = $code") ToastUtils.showToast("${message}(${code})") return false diff --git a/app/src/main/java/com/sw/dualscreen/viewmodel/UserViewModel.kt b/app/src/main/java/com/sw/dualscreen/viewmodel/UserViewModel.kt index 75a9ad4..568c174 100644 --- a/app/src/main/java/com/sw/dualscreen/viewmodel/UserViewModel.kt +++ b/app/src/main/java/com/sw/dualscreen/viewmodel/UserViewModel.kt @@ -10,7 +10,10 @@ import com.sw.dualscreen.model.response.DinnerType import com.sw.dualscreen.model.response.FoodInfo import com.sw.dualscreen.model.response.FoodOrder import com.sw.dualscreen.model.response.MemberInfo +import com.sw.dualscreen.model.response.PayResult import com.sw.dualscreen.model.response.UserFaceModel +import com.sw.dualscreen.model.response.UserFaceModel2 +import com.sw.dualscreen.model.response.UserNutrition import com.sw.dualscreen.model.response.UserNutritionData import com.sw.dualscreen.objbox.CollectedFoodInfo import com.sw.dualscreen.utils.GsonUtils @@ -94,7 +97,7 @@ class UserViewModel : BaseViewModel() { // 获取成功一次后缓存状态 SPUtil.getInstance().put(GlobalKey.KEY_FIRST_RUN, true) withContext(Dispatchers.Default) { - val list: List = response.result ?: emptyList() + val list: List = response.data ?: emptyList() val item = list.firstOrNull { it.userId == "1951105919342936066" } Timber.tag(TAG).d("getUserFaceCache userId = ${item?.userId}") val faceEntity = list.map { @@ -119,6 +122,31 @@ class UserViewModel : BaseViewModel() { } } + fun getUserFaceCache2(index: Int = 0) { + Timber.d("getUserFaceCache index = $index") + launch { + _loadFaceResult.value = false + val response = repository.getUserFaceCache2(index) + if (parseResponse(response)) { + // 获取成功一次后缓存状态 + SPUtil.getInstance().put(GlobalKey.KEY_FIRST_RUN, true) + withContext(Dispatchers.Default) { + val list: List = response.result?.records ?: emptyList() + val faceEntity = list.map { + FaceEntity(it.userId, null, Base64.decode(it.face)) + } + faceApi.updateFaceData2(index, faceEntity) + } + val nextPageIndex = response.result?.nextPageIndex ?: -1 + if (nextPageIndex > 0) { + getUserFaceCache2(nextPageIndex) + } else { + _loadFaceResult.value = true + } + } + } + } + fun getCollectedFoodList( pageNo: Int = 1, pageSize: Int = 100, @@ -130,7 +158,7 @@ class UserViewModel : BaseViewModel() { val response = repository.getCollectedFoodList(pageNum = pageNo, pageSize = pageSize, foodName = foodName) if (parseResponse(response)) { withContext(Dispatchers.Default) { - val list: List = response.result ?: emptyList() + val list: List = response.data ?: emptyList() block(list) } } @@ -199,9 +227,9 @@ class UserViewModel : BaseViewModel() { launchWithLoading { val response = repository.getRestInfoFoodsByType(foodName = foodName) if (parseResponse(response)) { - val list = response.result ?: emptyList() + val list = response.data ?: emptyList() action(list) - _identifiedFoodInfoList.value = response.result ?: emptyList() + _identifiedFoodInfoList.value = response.data ?: emptyList() } } } @@ -211,16 +239,46 @@ class UserViewModel : BaseViewModel() { _searchFoodInfoList.value = emptyList() } +// /** +// * 获取用户就餐数据 +// */ +// fun getUserNutritionData(userId: String, foodId: String) { +// Timber.tag(TAG).d("getUserNutritionData userId = ${userId}, foodId = $foodId") +// _nutritionData.value = null +// launch { +// val response = repository.getUserNutritionData(userId = userId, foodId = foodId) +// if (parseResponse(response)) { +// _nutritionData.value = response.result +// } +// } +// } + /** * 获取用户就餐数据 */ - fun getUserNutritionData(userId: String, foodId: String) { - Timber.tag(TAG).d("getUserNutritionData userId = ${userId}, foodId = $foodId") - _nutritionData.value = null + fun getUserNutritionData(userId: String, block: (UserNutrition?) -> Unit) { + Timber.tag(TAG).d("getUserNutritionData userId = $userId") launch { - val response = repository.getUserNutritionData(userId = userId, foodId = foodId) + val response = repository.getUserNutritionData(userId = userId) if (parseResponse(response)) { - _nutritionData.value = response.result + block(response.data) + } else { + block(null) + } + } + } + + /** + * 获取用户就餐数据 + */ + fun getQrCodeImg(orderId: String, userId: String?=null, block: (String?) -> Unit) { + Timber.tag(TAG).d("getQrCodeImg orderId = $orderId, userId = $userId") + launch { + val response = repository.getQrCodeImg(orderNo = orderId, memberId = userId) + if (parseResponse(response)) { + block(response.data) + } else { + block(null) } } } @@ -231,7 +289,7 @@ class UserViewModel : BaseViewModel() { launch { val response = repository.getDinnerType() if (parseResponse(response)) { - _dinnerTypeInfo.value = response.result + _dinnerTypeInfo.value = response.data } } } @@ -254,7 +312,7 @@ class UserViewModel : BaseViewModel() { launchWithLoading { val response = repository.getFoodInfo(foodName = foodName) if (parseResponse(response)) { - val list = response.result ?: emptyList() + val list = response.data ?: emptyList() _identifiedFoodInfoList.value = list action(list) } else { @@ -275,6 +333,90 @@ class UserViewModel : BaseViewModel() { } } + + /** + * 现金支付 + */ + fun cashPay(param: HashMap, block:(Boolean)-> Unit) { + Timber.tag(TAG).d("cashPay") + launchWithLoading { + val response = repository.cashPay(param) + if (parseResponse(response)) { + block(response.data?:false) + } else { + block(false) + } + } + } + + /** + * 查询订单状态 + * + * @param queryType 查询类型 1支付2退款 + * @param orderId 订单号 + */ + fun queryOrderState(queryType:Int, orderId:String, block:(PayResult?)-> Unit) { + Timber.tag(TAG).d("queryOrderState") + val param = hashMapOf( + "queryType" to "$queryType", + "payOrderNo" to orderId + ) + launchWithLoading { + val response = repository.queryOrderState(param) + if (parseResponse(response)) { + block(response.data) + } else { + block(null) + } + } + } + + /** + * 扫码成功回调 + * + * @param queryType 查询类型 1支付2退款 + * @param orderId 订单号 + */ + fun paySuccessCallback(queryType:Int, orderId:String, block:()-> Unit) { + Timber.tag(TAG).d("paySuccessCallback") + val param = hashMapOf( + "queryType" to "$queryType", + "payOrderNo" to orderId + ) + launchWithLoading { + var orderState = false + while (orderState.not()) { + val response = repository.queryOrderState(param) + if (parseResponse(response)) { + orderState = response.data?.paySuc == "1" + if (orderState) { + block() + } + }else { + orderState = false + } + } + } + } + + /** + * 会员支付 + */ + fun memberPay(param: HashMap, block:(Boolean)-> Unit) { + Timber.tag(TAG).d("memberPay") + launchWithLoading { + val response = repository.memberPay(param) + if (parseResponse(response)) { + block(true) + } else { + block(false) + } + } + } + + /** + * 绑定订单 + */ fun bindOrder(userId: String, orderId: String, block:(Boolean)-> Unit){ Timber.tag(TAG).d("bindOrder") launchWithLoading { diff --git a/app/src/main/res/drawable/ic_gray_big.9.png b/app/src/main/res/drawable/ic_gray_big.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c14f79946b385a7cbd4b44697be2f1887489e71f GIT binary patch literal 1381 zcmV-r1)BPaP)J_uJ000FnNklEpm6vu-&R6@Y97dTOsD-uGeNJ!<*i9?QDIaK68%i2y!S$j4uAqj2CCWWTW+TNyB zX(>v>_veKJr&g#Z4jigN;Q&H3&7v3Y;+DfS9H#xia!4DYt){kz9|Rf!t;~pLhN%F z9=6K$XDrWunFR8jO0Z1A{Xp-3C;p2C?Kj8;IUzUXh+L5~a>p3>xFog_uT6%JIo{Gs z^vhFJxcgn^X{ObZsr9eirQIl{5H7ZqtUA%rphzG`1_?+W~ z(=^zhcmafLqMA|dP(##`7k6mFR%f1~d2@yab%PI5=$IR*DQe5>J&-ZxEqf>o`^75+<{im zjO&<7&^+}b@k>g_!T)#Tum*3mz$WFo>NNZ@$eUJpLL|3(ggks|btK0`sME_FajRi9x?YSRD=nL6i zn#;8oGmNYH-jqgyNx1$Ci6I;nR<#C#VT9EtLj+g#27+N+Z8pTMlm>!X+-fp}FaK*W z9)CSC#CWCtuiii~33wne#G$Ek@@U&|;DN*tlSe<)8VF_q4-`u=BH1Hmldfy59C z{FdTD zhtFsS3B?3jL-S1y0gj#goc5%lcCb(^pfR*=);`q`04q*0MR9?)(3tDKsUc!h9Gt9c zCliJnXqsk*Ee!$QJ@ut*M+*eBgr;2QZ5sm2*S={~-npoqTo^8(A++TBwrz+Q>{Vq4 zGJHU@_&&o{v}FhYhaEn4N$XS?OrX_PSA}NUHbe~OAvJqJOF$S5piS0VVKX{5M9lHU zFB;y=2U$(xfvn`^VQqc%d%DN0jM!* z-Od_eD{?nPGq`kNQ6oE({6H;H)BBkgvgoQIV(^?D_slVni6hI}AcbsDGt>?>L@jxJ z^Q0$+;9#!9r49=qS##*1Ca4W+l*hWD9r|L3X5y>I)Z9u`1QVZ~V9XdhYS4?TKo)&B zL>hCazl!dx9Xb9{^yiHttwAsrj0t1I7%^5p{(dr$hDZY|Y5aPo=U1a*;>OFHQ|AWq zih`Vw8*)Uh$Qilkxf|#fLt}_6P-x7xc%(bC@NqQvLI~{5Aqswx5D42e{6ZlZ=IN~U zOZ+|B;usu@bKqP!C(eyN&=>kd-^gJYM9-oSh7j^Y3?Z~YR@g8F|3WYmF@(^97(!@4 n3?Z}-nL!L8#3Y80kci_RkTqXhUb(T400000NkvXXu0mjfdQg!@ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_gray_small.9.png b/app/src/main/res/drawable/ic_gray_small.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0ca186f76279dc363108c2bc70f975c951dfc931 GIT binary patch literal 876 zcmV-y1C#uTP)%ew_20d+*%R*QX+Sp=poL>1J_I&x&Cp zM&yZAEo*J+rud|pVvG2ynbr^bd!MlDq0bNSU9FASa{8bzjd3^@#vH~Rn2XOJ#pq9D z$`>@Vbdw4%P{CDVhl>Br<#dX}xps&uazHNe)Y3)d#*^);7%@thXm#8oHgvQ6jThEM zeAg*QEe%2Dyi0M?6&=z`1vlFN$sfHKX=;t~kKG1ddp2 z{j6q)DH`l2pP<)(17ZqJxTltpG?p*ZdGUo0*z=GRxZ%EhL(7Wm)M-~5MB%avN8DRO z#0@c|w(`-yQ9LJxxIZV7ner9gwDx!>MKi2DIBSq-7{(cTJAIZLD_Q|(aOa8CGS&^= zND&OU^F-1zt?&klpjef^E7BC*{7;6i2JY%sq&VOW6oL8WiA;{K^xV(Cuz)*HWOimv zYM=-P+<7ANi*Ka{ieSK#F@ z29cofu%cuJ0FL0w^(Kh~vya}{$+2arv!Vvvz)`(3Uy<%MS7)XSoVeRLkVt?-bYkw6 z+UjO)E5ikxa8E~ybeVs$Y3B+rq``Xy)D8#SOWPt{u%t0)FRW11h+6%&u^(-Tbh*D& zwI}B{?DWJ_DS@binot{RJ_uJ000GFNklBhd+nH%g0VyrT3kfj>6BE31^3bFIfYFnNMB8_|phkrT4J}j)yR)+_ zN~|@s2IDUPz=YePfK}vBoeq=772I=}EL9 zdJktG=qrvtW_jb!kWhO`q!Mv~_=Uu|RS~q)U@ql3>A96KSIil6M-DtMi93jg{qX@S z=RQqm-aabuqT{Kbk|cVo=p4$qEFw4LxbEnl^*n#Gz&A0SIRzQdFokOG+m5H zMu?Y-s5NTNb?A6x=3W}HJa>jx(0@iuTxcVxxm9pypaIuq&BMy6?X=gPuYI^9bcV79 zY95+!o!TC~-o&u&xhHAM^dFy?&{?1fw1Gxkx7Z_-+w&j|Iz`;%6A=;zG@62DT*p{~ zI^RuPjTl%+HqdN0*R$p5e>ZzSU4rJE6g)mQ7j+97LQAf1Q-L>lwx@mw4l0Ie-)%yo~9O#bB^@_;G*K;uk4 zyMyar7xwInmLod}leh}axeuyAi;ks;gM<`ASBfR>10DKTN)ZPL=?B_#KlIQ-L$;TO z0`2R}kSVHNypdoQ8E@jLsv&G&P4fnVS=j#Mbkz_}L0#ev1k+HLZeJk^?jPX>f=R#w zw+-RR?;1=89;h0^DNg>w8wiF$9;g~(;N)xaYTIz&fvO=ko;na}AeaR_P&LHxmq$Vk z1haq#s)pG1T|O9i@0Cy^!3>~1JWw^nqZhnj%jYwphJqPDdw8JE5MXfr^-yCW-9Yn- z{vkt*o;w!wmG*`X64D8@hUP080*rk14)&y>gN2mgPin1ewU0Ce(7O&_Op#hhTWHL6 zU(pcS6lZ6HzT??&XF^v4O`$E_EB>Xa?=Lo>4Sq2mps|T$~CGDkKwVwc1somZl9+0r#Q7 zg*QSI5Rw73X|z^YiIxpf0sGj&55*Ws0b1~93(auXhNu8H>R0IU>|*VqnxpouToE|2 z8KT1Ix4B^RCvOJ>@4p(JxDYF-F=~yPa~)bGc0<&HOBWV3vNMSf)Dktlo7+Mo+G>aj zc+Wn3X0~jO6Z=9*3XMU{P&?ERwdD1UlQl5}2lqN$>h!C2d5IQ=YJ%FJMschQnxP|x zs0EH6IXfFXa{4X3LN@W;335j6r~zux?yEo}I&O$4M!z|#f5Ee9=^&jcWRg;PZZpUQ zIUzUXxRr9{`FD~;8X}6(^ErL?41Ibi*!1ziV8g2O< literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_green_small.9.png b/app/src/main/res/drawable/ic_green_small.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c60b40495b4162a3d046e1cb12e46e5d6d59ba37 GIT binary patch literal 914 zcmV;D18w|?P)lFKOPx6F*+`0F>PiJnYG&RYpz1lx{ZeJjw z_6JSvlwxXwAyd0fe`gg#U82Vy6;u68&)4bscl!H_UK6>{>zkSP)-l#PhK|J?nYjir zH`c&feEnLi=0GZbB$!ms1P%2DgbHB{|d{G&G%>SmRCA0c*&Hj6An*g$p&vbOW%xX zWmmr_ssm(3b~xZ(yx08TUfKgkXtJMtfkp!k-~vv#rlO_H=tpUSRX(9aTZJ3$%e83m z0PPXqTqcp2*8T}M1Ke9)DQ4`Xyp(qaj^K*>vnrU19}5}U4}OrO0OShJ@-6E69=b98 zE>+;NbEL5{j#PFT)dMP_BnGqW&o14p^eTt#Lt z^YGjy$0UsooMbO&Pa**}(a6HMywm|XfD1U`o^}+OCHgiYI-Xv0PTn9OI~;H?C5yC$ z(kb2fY_u`XP|Ap`ZkMqeC5g<^^KME+7H^91!}{ApkqOz5k>@T(St4_ZzMd43=VLW3 z)sjaUkcH>-%0G+DrDr7}4!^i%?I~^dFE|>m7SJ1dM6c+X=O_nXMRIyprbO5B9s0D# ztsnMn4=y@FRT`{`wb285K~KC-Kd7ikH*oua4IIA;a7IKH#zbd&RCGKU5r^ilSodiN z-#R;N-S}=3&p?mw>DGG~gRwXU$6^l5g*h=d)+ltVQVDilWW6Fq`UEN5mdW3cl!g@P o6H=s4NRd7vMf!v#QIPP0LjV8( literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_orange_big.9.png b/app/src/main/res/drawable/ic_orange_big.9.png new file mode 100644 index 0000000000000000000000000000000000000000..08f5b4445de2b094ac616310c26520cf8b311563 GIT binary patch literal 1343 zcmV-F1;F}=P)J_uJ000FBNkl`Vj&+}SK)-)Nzklx9dYbq^KhM={Yo7kLK=_L+ zgul~s#5-aN$ArgP56~C-MBl+Va4tG$cy6^BW8veIT7h~qpw@ba)lL$Bn9RIHW?c6i z>mmI+65x+{N55#|c|);`1+c`2)&&Syj78sEeLmxlNy_SB8*9hvtmALj!05O}I{lu8Bdl zh3>(lB*GmM;Xgy5k^@ZwZJ-fp#r4a5`ASu4LuwCw68@&iKH~xi?Flr4cBCP+4X!tR&DJ+QS3xOV8`&pxW-*m0MnNb4Ta{fd}LTJmEgAc)h5qt#m)TNdsx{ zfeC%50dL?D_bv5$_Pbg~m#52g|H76pABd1C^t?x2!87h-DphmT0ZLxoJh6~%be*0` z4sbuauIYnn4F%y^A-0dp3cMo^;U)LCqYB<4+WM(+0wJHkOY)TaysVnE)o$wGt(EHKqwc;Kpco4+oY_z)2k;&lNCX1BK5jM^iVZxE{5JxzFlPBvN6dqSVgj$>`I3PEU;haH7m#tV zP%Pjvyl(csWgq}noDz!S0&n3l_kGDgM4_k;o1F>y2A;MG!%qVNzKw>DB)n50pTJ9a z%6(pTAV6c>^54l$X6}K9@RIx6aUdc-pO+_)JOa<)9rv>p9R&g)VINMJCl#^@y!zQy zp_z^Y5rO;A+Y{yhglqtB+N~9qqU%6J%+qu18`<5=4DbS;aG#dTF9#w5X~gSO*}LdH z&>Y%#b4B2!7Kn((nB{*wBaf=R02)JUXwH4;med2$3@%+*)X0-bdO%BP`YX4EcC2V1 zBJiI5>qt0}R}zknfo9MS8bV91Z<_QZ5FFg=aH+!r$dj#c184$mpivs@f==j5AexD; z9u#I~U%2VFaGd zVG2HxFbI!n_=LhR+^5^^nc#0|gSI#Z$D$APg+9?Y&Vh5`oH#eefU)rL<%vQBLP!q@ zgpdGHkU$7A5(puI1VTt4fe;c%AcO=#7^I|{>wmb8m3=I!ll}kz002ovPDHLkV1kpE Be=-07 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_orange_small.9.png b/app/src/main/res/drawable/ic_orange_small.9.png new file mode 100644 index 0000000000000000000000000000000000000000..082a7fe1e99073ce0cfc8216f2f90ee6c02e6557 GIT binary patch literal 863 zcmV-l1EBngP)8BcbB^?>RWhDA=kv^X93eRJ7hAL9s#g+s+@g5km*i{L zmTx^re()UYvu9gh=>JV(&$H#RZ(FDIdC-MzweX#4gSP4#x|aGtU#d^)8)INBef-=- zAVgtjPF(kF;kYIFjtX8U0d@L&X2=;87%LoeJSXLDdbT5gc zHY={soq6LrvS|!3VJHXW0#0;KeZwz{TQs#d^bQ%h0XMp@*l-_D6-8d-GRf$X6KUvYKH^e%fKSrU`nIYNtmIi5w*rG<2VKq*{1c<3VzWv|Gr=* zkatiMYD0~B-TfF!WGBt%w0Atow^Zbg8c>T~UsC>AWG5|J2FEM3Bp%U={6jP0tbp8* zBXUK~dL6@%sz@CykCWB#Ztqj#_5UCjV`6ONfLsP$vPl`K$T)C(z!MM$+M|`Qz#q$2 za6rZGEr#bb6pvYhgD+mgI>Bf74sFmD*Wg<8fxgfu`o>@8KEHWjakVU2d pi%ba?nG!5AC0JxiD2W{D#9w#MeY)~^E0+KO002ovPDHLkV1ix2gRlSq literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_red_big.9.png b/app/src/main/res/drawable/ic_red_big.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4b30e9c894848544a562f24e4f7b473eccad1edb GIT binary patch literal 1304 zcmV+z1?T#SP)J_uJ000EvNklveguRd z2_MnXOh6bDjS+Q29H)Jsrn~GqRrE{`)ze*d&q<#240EgQz3=<>t-95nU=|hCraES} zbKY!j!EBFSUp{K~YR7E9em zy)kKQjFGW2X2#AO{Jf$zP)V)GG~2C&AJAm3l_nW%4rz&|XzTT!$Q3g7D7dAwU1OfXa2#w$GYKGsq? z`HM>4^@@&zSw^1Wo%eIorKRT~o$#GbJ02gW${HTxrT2HN(n;pT#flDs27;G(>V4i& zX@C2i4*u1jG-x(>inreHk#)puuMYalpDbtxc#Fs0_sY_B=IMCAlmPM=uf6|;I%M`( z>?9IGUgNpXL0)Qbq;ycwZhChJ6~#ArN{xdgzyd1OEpi%Wjn#1gUW=4@7*gAs_>JAQrOhAKxHI3o?)g z;)HFBkG2zs4CH}0V>?O>g0vt5c_4nU`%4XiwD?{b$OExr4|YGdZKXy*8sI${$OG|< zez_8>M6%#L87KsTgq*hRrN%+KIVI2Wz7z%n8Z9`?R65Wub@LeXCEmR*JS{jPz4B^|IBp=cd=inreHbprv*T2f*=+8*!{Prc6@ z4g}oLO~*H}`)E9Ph?m~qu>&#Ss+O79fiw?1!#nS16=MYgNZ481(LGktaWGrp5nipg zDhxArAO>(9`YJ9XGYj5~x>vXxn-0W)pVaA>5saAuFYv_sv{CLk5CcdfAD_mvi>(LE z(S9>4f~U4X4B&co(eCSh5nI)XgT`n*&OO3<)ERd6TGyXTVLMTp6RmlL|S&f3&lWUP#tvDdj9m=ui(#3*h`Xs)$);rb7(IN!o>L7XfA O0000jaqE1T6O$bmyhzN-awIG!i z5LB=OHYvpXzZ08ee3Cf9E_OU4eM+Pp&zbpr;&T!ai}J+{kpl}NCw!5!;3D2%2G{Vu z0bYQ2zUOU$A7C2bK4d!4j=45Wp!MXJOWeg7u9YRCr@p=U;)kHo) zKwHbnk#;yI=4K77<(9}{)~1UsRG{diw?!_X=y~wf(O4mX&~L1fwX$a2$NvZqg`7lT zS5eryF1R$HcJ=_Vr`VHjGPjr)IfzN;N-b{?>lNwi0Y*CLE*9w*_)mty19yK#cK+u}4l>g4I~LiHO8)%I z1iFhwK9*gH0Y*CLE*AMl_9g}x>7ct<!X&|bzC8NnUu8Io3Eg|bKX8tuxX7)xZt zM=bAGSmyVq@EOXU*c*G)eGg+Ik-eNLcJr@51+Yyzp!y3* literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_yellow_big.9.png b/app/src/main/res/drawable/ic_yellow_big.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fe24f3e4f3c42e6269697756ef6abbf40bf7cd91 GIT binary patch literal 1437 zcmV;O1!DS%P)J_uJ000GKNkl0R;myJ2?_SBSY(ANp^zDuGzpZJ($WXeW$7-gx-Jq5B%ZO; zKv7yAEi^zfuOy9I`iPRI6%A1G02)YrIsX(7_PtX(PW>3qoFjd*J-&1Ax##~qGk3;q zZ5$kNil2si?(>E^9&@t#bGE6sJEq=EukTr=)@K{~M{Y(t=9toV2!u1bd&vIZB)%L9Wqjz94Ax@pC~=lw0bkpDX2z+%X4vUL5NPC%g3#D&$L! z*?EwDv8HWkGtm-#qiA`|1#_a$2QkOdfzC(e`6oL1``hnz(yu;krS%j%ZCtc_juXV zv-B%CM3c!%MXzW zx+wASkjXH$WgN9e&1D^$9^VgYPtyAQLrQWfBypy`ETQ($K-Q(D) z4%0N&panFMb*g*VpT6>hW9T0fw?YzQnh7)^ZJ?2?Tg~IN+3_F^dYIPEt4bnF#PBsb z49#R6YZA7pzvvj+oH{TQX-G3@C+oT47|ZJS)79*ec-%ftDq7w)wIk3{*0-wgpCTHX zrw+ihB!=!mQ(5PAg`4Soh7L6gN~cUq15Kf=tasV4GTQUB^RnC-6C0MHv8;P&xC8oT zI_K~Wrr4t`xmkU)tba*-JGkXxUP&YfL!Wa=bJ+($P=k!J6BBPTdPeqvAGiOd6tV*o ze@J`T4{h`XFE5jeS7HY5_Nqc|#3Tqi-T6Xb2-?smH((M+U$G&qkOoY$u!;?_7}9`A z7K{HIg8$dRkOu-oc-hoHN&_ZQzypCH&K>XKN81Sp9taFE_w^e}114F(1A!ryt=&ok zCRxA(fg$p_10wfXm(qwy2GAZJ2n-?4y(?~v?NS;t$pG5J10{yY6BkE%l*UZFf#%R& zF$DN~YM+=owpH1Qi6_t+niup}3<3Ud_Fzq_?99XqXbi23wGTA}z!j&LVN=8vXbX*H z-S21!utM&c7-Cbz4QL8&WxXpJ0^FR~D{`Onax^YLOK2+Vylz8)Thj-`>{qWVoinWk zG=!G2zEvBdz~cDZyaH)Kpc%B2^$epbLx8oj`^A-SwhK38U?zG%D`+O`cqghhM1h;$ zUUB(kuaW>04WJD)l69-Zh7D2RPxl>h`2-syDnJWpBI~qX?%EIq{vtQx@hRWCXgsJn zY7Y%$U8<#KhA4pZ)xzjbUaB?#)c88px|(Z*O4QsC#o*92e`-6gOlk;fiJIQcX`vi- zHADeCXJ4`R_!F5PeodJqQy$a|wL=Y2OS!(aq#=fo!JV?}XLgE9CwllHS_r5KYJ(b; zyQ^3anqr7z;CMW7`}w;aei0^zl6QK+oH2LQ0M8ieeH181(+v^E>f}EEA3Rr2zbP(_ z^u+2K1arZhFgMI`b+WNXfJ#Kt5MiuM@Ar=+zy9!+U(A^=d&T+V+ah^HK~BgGIU-l& zjNCB?d0tVYWeiacJg~vJcG=!7Zv41QEYP|48VP~5`OL{)adD(uod05*zf3zz7ibU+ z=V>>iidg{PO;8)O#Xi^ZcocPFVF;#nupyWdUnIQG!i_S zh-hamL%(7%{kFxldnVJKScVoe4Q+;ATcp2#(9aEm=R)sq{(W!J9*a4cOF8UZloPqJ z2G$bSuejiWz&@*AJ8ZGwxp+jolVJJ~H9JpaL^-<$*3#zfwW$Ww@{TneL2Y8aWfgIw z{uu3!P=aX&HL@f(Rvws4|AHD(D{2<|D0$$MHCf{+`o!;=hMpD+t`tx^dWiKmoG$5Z zO&axw%!nSQBGO_}dw?|U*f4q&`}QqxfYX`NYr1?1>@~J})Oyjg=wZh(+8;b>+UH&= zzbMKDErZ_SK=k4{M*38K?-ls<7S;BlFUZM0Sa%xog>mJ<9{+#086K zw7Ci&|NLP*+LUobet3FO8ldn7+&Ln@#yX?{3U9!jBQi5}lfQp_UK*q*4xGWABa%!uGYr7INarl1mEMGJaJ#1q{s)3;414)5(!q!PM%advmkH-N4d^i zMP@JaX?12wzzN)lz6y#2I7AmluF^JEyAuxJ0!~Cv{}h?!*LXLdeIAmMR}1JJ4n!~8 z7MTTGdT#h~RqRmoI5!+}y^P)1mdGp{6F2zh*Vp*eqgJVaN(VimH}oj>U5p)x%;o3U zb^hsP8=tOVsi+-2pck<}ul%>jT-NCvS$^BjXJ3T)#KRV;;Bo=Ap+?k-n#DeLg0CV) z)>Ga5+h_-0c-6+!&o1%F!Pb)A>|-sgiM3G!YC%n6oqn*ZBHh640}gOJ6)eALw;TLO zUtnl + android:background="@drawable/ic_camera_rect" /> + diff --git a/app/src/main/res/layout/fragment_cash_pay.xml b/app/src/main/res/layout/fragment_cash_pay.xml index 4f66683..5a924ec 100644 --- a/app/src/main/res/layout/fragment_cash_pay.xml +++ b/app/src/main/res/layout/fragment_cash_pay.xml @@ -25,4 +25,21 @@ android:textColor="#ffff3232" android:textSize="36sp" android:textStyle="bold" /> + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_pay_result.xml b/app/src/main/res/layout/fragment_pay_result.xml index 5664e3b..a477ee9 100644 --- a/app/src/main/res/layout/fragment_pay_result.xml +++ b/app/src/main/res/layout/fragment_pay_result.xml @@ -9,6 +9,7 @@ tools:background="#FFF4FAFF"> @@ -86,6 +87,7 @@ android:id="@+id/ivRecImage" android:layout_width="match_parent" android:layout_height="456dp" + android:scaleType="centerCrop" tools:background="@mipmap/ic_launcher_round" app:shapeAppearance="@style/round10dpCornerStyle" android:visibility="gone"/> @@ -231,8 +233,8 @@ diff --git a/lib_face/src/main/java/com/sw/plate/utils/arcface/FaceApi.java b/lib_face/src/main/java/com/sw/plate/utils/arcface/FaceApi.java index fea71de..f7aaed9 100644 --- a/lib_face/src/main/java/com/sw/plate/utils/arcface/FaceApi.java +++ b/lib_face/src/main/java/com/sw/plate/utils/arcface/FaceApi.java @@ -39,6 +39,16 @@ public class FaceApi { faceDao.insert(list); } + public void updateFaceData2(int index, List list) { + Log.d(TAG, "updateFaceData: index = " + index + ", listSize = " + list.size()); + FaceDao faceDao = FaceDatabase.getInstance(App.getContext()).faceDao(); + if (index == 0) { + faceDao.deleteAll(); + faceDao.resetId(); + } + faceDao.insert(list); + } + /** * 激活arcsoft 人脸 * diff --git a/lib_face/src/main/java/com/sw/plate/utils/arcface/viewmodel/RecognizeViewModel.java b/lib_face/src/main/java/com/sw/plate/utils/arcface/viewmodel/RecognizeViewModel.java index 65989b5..2f8181f 100644 --- a/lib_face/src/main/java/com/sw/plate/utils/arcface/viewmodel/RecognizeViewModel.java +++ b/lib_face/src/main/java/com/sw/plate/utils/arcface/viewmodel/RecognizeViewModel.java @@ -283,6 +283,7 @@ public class RecognizeViewModel extends ViewModel implements RecognizeCallback { } // 填入在设置界面设置好的配置信息 boolean enableLive = !ConfigUtil.getLivenessDetectType(context).equals(context.getString(R.string.value_liveness_type_disable)); +// enableLive = false; boolean enableFaceQualityDetect = ConfigUtil.isEnableImageQualityDetect(context); boolean enableFaceMoveLimit = ConfigUtil.isEnableFaceMoveLimit(context); boolean enableFaceSizeLimit = ConfigUtil.isEnableFaceSizeLimit(context);