增加消费码支付功能、支付逻辑优化、金额问题优化、订单绑定优化
This commit is contained in:
@@ -78,9 +78,11 @@ abstract class BaseActivity<VB : ViewBinding> : AppCompatActivity() {
|
||||
hideWaitingDialog()
|
||||
val view = View.inflate(this, R.layout.dialog_waiting, null)
|
||||
if (!TextUtils.isEmpty(tip)) (view.findViewById<View?>(R.id.tvTip) as TextView).text = tip
|
||||
mDialogWaiting = CustomDialog(this, view, R.style.MyDialog)
|
||||
mDialogWaiting!!.show()
|
||||
mDialogWaiting!!.setCancelable(true)
|
||||
mDialogWaiting = CustomDialog(this, view, R.style.MyDialog).apply {
|
||||
setCancelable(true)
|
||||
setCanceledOnTouchOutside(true)
|
||||
show()
|
||||
}
|
||||
return mDialogWaiting
|
||||
}
|
||||
|
||||
|
||||
@@ -63,6 +63,7 @@ import kotlin.math.roundToInt
|
||||
class MainActivity : BaseActivity<ActivityMainBinding>() {
|
||||
|
||||
companion object {
|
||||
private const val TAG = "MainActivity"
|
||||
const val TIME_OUT = 5 * 60 * 1000L
|
||||
}
|
||||
|
||||
@@ -237,32 +238,35 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
|
||||
//计费
|
||||
if (mealPickupMode == 0) {
|
||||
//即放即取
|
||||
eatWeight = presentation!!.lastWeight
|
||||
foodWeight = presentation!!.lastWeight
|
||||
eatWeight = lastWeight * 1000
|
||||
foodWeight = lastWeight * 1000
|
||||
} else {
|
||||
//余量计量
|
||||
eatWeight = presentation!!.recognitionWeight - presentation!!.lastWeight
|
||||
foodWeight = presentation!!.recognitionWeight
|
||||
eatWeight = (recognizeWeight - lastWeight) * 1000
|
||||
foodWeight = recognizeWeight * 1000
|
||||
}
|
||||
} else {
|
||||
//不计费
|
||||
foodWeight = presentation!!.recognitionWeight
|
||||
foodWeight = recognizeWeight * 1000
|
||||
eatWeight = if (mealPickupMode == 0) {
|
||||
//即放即取
|
||||
presentation!!.recognitionWeight
|
||||
recognizeWeight * 1000
|
||||
} else {
|
||||
//余量计量
|
||||
presentation!!.recognitionWeight - presentation!!.lastWeight
|
||||
(recognizeWeight - lastWeight) * 1000
|
||||
}
|
||||
}
|
||||
val eatNum = getEatNum(eatWeight, checkedItem!!.specWeight)
|
||||
createOrder(
|
||||
foodInfo = checkedItem!!,
|
||||
foodWeight = foodWeight.roundToInt(),
|
||||
eatWeight = eatWeight.roundToInt()
|
||||
eatWeight = eatWeight.roundToInt(),
|
||||
eatNum = eatNum
|
||||
) {
|
||||
presentation?.dismiss()
|
||||
startActivity(Intent(this, PayActivity::class.java).apply {
|
||||
putExtra(PayActivity.FOOD_INFO, checkedItem!!)
|
||||
putExtra(PayActivity.FOOD_EAT_NUM, eatNum)
|
||||
putExtra(PayActivity.FOOD_ORDER_ID, foodOrderId)
|
||||
})
|
||||
}
|
||||
@@ -270,6 +274,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
|
||||
}
|
||||
}
|
||||
|
||||
private var recognizeWeight = 0.0
|
||||
fun updateCurrentFood(foodInfo: FoodInfo?) {
|
||||
if (foodInfo == null) {
|
||||
binding.tvFoodName.text = "-"
|
||||
@@ -280,6 +285,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
|
||||
return
|
||||
}
|
||||
pauseAnalysis()
|
||||
recognizeWeight = lastWeight
|
||||
presentation?.updateFood(foodInfo)
|
||||
binding.tvFoodName.text = foodInfo.foodName
|
||||
binding.previewView.visibility = View.GONE
|
||||
@@ -393,13 +399,9 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
|
||||
|
||||
@SuppressLint("NotifyDataSetChanged")
|
||||
private fun updateFoodInfo(list: MutableList<FoodInfo>, scoreList: List<IdNameScore>) {
|
||||
Timber.d(
|
||||
"registerDataChange识别后查询接口数据:${GsonUtils.toJson(list)},识别数据:${
|
||||
GsonUtils.toJson(
|
||||
scoreList
|
||||
)
|
||||
}"
|
||||
)
|
||||
val queryData = GsonUtils.toJson(list)
|
||||
val recData = GsonUtils.toJson(scoreList)
|
||||
Timber.d("registerDataChange识别后查询接口数据:$queryData,识别数据:$recData")
|
||||
list.forEach { foodInfo ->
|
||||
val scoreItem = scoreList.firstOrNull { it.name == foodInfo.foodName }
|
||||
val score = scoreItem?.score ?: 0.0
|
||||
@@ -702,12 +704,20 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
|
||||
lastTouchTime = System.currentTimeMillis()
|
||||
}
|
||||
|
||||
fun createOrder(foodInfo: FoodInfo, foodWeight: Int, eatWeight: Int, block: () -> Unit) {
|
||||
fun createOrder(
|
||||
foodInfo: FoodInfo,
|
||||
foodWeight: Int,
|
||||
eatWeight: Int,
|
||||
eatNum: Int,
|
||||
block: () -> Unit
|
||||
) {
|
||||
Timber.tag(TAG).d("foodWeight=$foodWeight,eatWeight=$eatWeight")
|
||||
if (foodWeight <= 5 || eatWeight <= 5) {
|
||||
ToastUtils.showToast("请取走餐品")
|
||||
return
|
||||
}
|
||||
val mode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0)
|
||||
val chargeMode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0)
|
||||
val pickupMode = SPUtil.getInstance().get(GlobalKey.KEY_PICKUP_MODE, 0) ?: 0
|
||||
val order = FoodOrder(
|
||||
deviceId = GlobalData.deviceId,
|
||||
foodId = foodInfo.foodId,
|
||||
@@ -717,9 +727,11 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
|
||||
foodWeight = foodWeight,
|
||||
eatWeight = eatWeight,
|
||||
//根据specId对应规格重量计算
|
||||
eatNum = getEatNum(foodWeight, foodInfo.specWeight ?: 0.0),
|
||||
eatNum = eatNum,
|
||||
userId = null,
|
||||
notPay = mode != 0,
|
||||
notPay = chargeMode != 0,
|
||||
//即放即取-1,称重-2
|
||||
mode = if (pickupMode == 1) 1 else 2
|
||||
)
|
||||
viewModel.createOrder(order) { orderId ->
|
||||
runOnUiThread {
|
||||
@@ -733,8 +745,8 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun getEatNum(realWeight: Int, specWeight: Double): Int {
|
||||
if (realWeight == 0 || specWeight == 0.0) return 0
|
||||
fun getEatNum(realWeight: Double?, specWeight: Double?): Int {
|
||||
if (realWeight == null || realWeight == 0.0 || specWeight == null || specWeight == 0.0) return 1
|
||||
return (realWeight / specWeight).roundToInt()
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.sw.dualscreen.activity
|
||||
|
||||
import androidx.activity.viewModels
|
||||
import androidx.fragment.app.Fragment
|
||||
import com.sw.dualscreen.GlobalKey
|
||||
import com.sw.dualscreen.R
|
||||
import com.sw.dualscreen.activity.fragment.pay.CashPayFragment
|
||||
import com.sw.dualscreen.activity.fragment.pay.FacePayFragment
|
||||
@@ -13,6 +14,7 @@ import com.sw.dualscreen.ext.gone
|
||||
import com.sw.dualscreen.model.response.FoodInfo
|
||||
import com.sw.dualscreen.model.response.MemberInfo
|
||||
import com.sw.dualscreen.presentation.pay.ScanQrCodePayPresentation
|
||||
import com.sw.dualscreen.utils.SPUtil
|
||||
import com.sw.dualscreen.viewmodel.BaseViewModel
|
||||
import com.sw.dualscreen.viewmodel.UserViewModel
|
||||
import com.sw.plate.utils.ToastUtils
|
||||
@@ -25,6 +27,7 @@ class PayActivity : BaseActivity<ActivityPayBinding>() {
|
||||
const val FOOD_INFO = "foodInfo"
|
||||
const val TOTAL_AMOUNT = "totalAmount"
|
||||
const val FOOD_ORDER_ID = "foodOrderId"
|
||||
const val FOOD_EAT_NUM = "foodEatNum"
|
||||
|
||||
// const val MEMBER_INFO = "memberInfo"
|
||||
const val TAG_PAY_QR_CODE = "tagPayQrCode"
|
||||
@@ -55,13 +58,14 @@ class PayActivity : BaseActivity<ActivityPayBinding>() {
|
||||
private var payResultFragment: PayResultFragment? = null
|
||||
|
||||
var foodOrderId: String = ""
|
||||
var eatNum: Int = 1
|
||||
|
||||
@Suppress("DEPRECATION")
|
||||
override fun initialize() {
|
||||
super.initialize()
|
||||
foodInfo = intent.getParcelableExtra(FOOD_INFO)
|
||||
foodOrderId = intent.getStringExtra(FOOD_ORDER_ID) ?: ""
|
||||
|
||||
eatNum = intent.getIntExtra(FOOD_EAT_NUM, 1)
|
||||
// totalAmount = intent.getDoubleExtra(TOTAL_AMOUNT,0.0)
|
||||
// memberInfo = intent.getParcelableExtra(MEMBER_INFO)
|
||||
binding.tvFoodName.text = foodInfo?.foodName
|
||||
@@ -129,34 +133,6 @@ class PayActivity : BaseActivity<ActivityPayBinding>() {
|
||||
}
|
||||
}
|
||||
|
||||
// private fun showFragment(currentFragment: Fragment, tag: String) {
|
||||
// runCatching {
|
||||
// supportFragmentManager.beginTransaction().apply {
|
||||
// val existFragment = supportFragmentManager.findFragmentByTag(tag)
|
||||
// if (existFragment == null) {
|
||||
// add(R.id.fragmentContainerView, currentFragment, tag)
|
||||
// }
|
||||
// val fragments = supportFragmentManager.fragments
|
||||
// fragments.forEach {
|
||||
// it?.let { fragment ->
|
||||
// if (fragment != currentFragment) {
|
||||
// hide(fragment)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// show(currentFragment)
|
||||
// commitAllowingStateLoss()
|
||||
// }
|
||||
// }.onFailure {
|
||||
// it.printStackTrace()
|
||||
// }
|
||||
// }
|
||||
|
||||
// fun showPayResult() {
|
||||
// payResultFragment = PayResultFragment.instance(1, memberInfo)
|
||||
// showFragment(payResultFragment!!, TAG_PAY_RESULT)
|
||||
// }
|
||||
|
||||
override fun onDestroy() {
|
||||
qrCodePayFragment?.presentation?.dismiss()
|
||||
cashPayFragment?.presentation?.dismiss()
|
||||
@@ -182,23 +158,36 @@ class PayActivity : BaseActivity<ActivityPayBinding>() {
|
||||
}.also {
|
||||
it.foodName = foodInfo?.foodName
|
||||
//确认使用vipPrice 还是 specPrice
|
||||
val totalPrice = if (isVip) foodInfo?.vipPrice else foodInfo?.specPrice
|
||||
it.totalPrice = totalPrice ?: 0.0
|
||||
val onePrice = if (isVip) foodInfo?.vipPrice else foodInfo?.specPrice
|
||||
it.totalPrice = (onePrice ?: 0.0) * eatNum
|
||||
}
|
||||
scanQrCodePayPresentation?.show()
|
||||
}
|
||||
}
|
||||
|
||||
fun updateQrCodeImage(qrCodeUrl: String?) {
|
||||
scanQrCodePayPresentation?.loadQrCodeImage(qrCodeUrl)
|
||||
}
|
||||
|
||||
fun showPaySuccess(isVip: Boolean) {
|
||||
showPayInfo(type = 2, isVip = isVip, memberInfo = memberInfo)
|
||||
hidePayTab()
|
||||
}
|
||||
|
||||
fun getQrCodeImg(orderId: String, userId: String? = null, totalFee: String?=null, block: (String?) -> Unit) {
|
||||
userViewModel.getQrCodeImg(orderId = orderId, userId = userId, totalFee = totalFee) { qrCodeImg ->
|
||||
fun getQrCodeImg(
|
||||
orderId: String,
|
||||
userId: String? = null,
|
||||
totalFee: String? = null,
|
||||
block: (String?) -> Unit
|
||||
) {
|
||||
userViewModel.getQrCodeImg(
|
||||
orderId = orderId,
|
||||
userId = userId,
|
||||
totalFee = totalFee
|
||||
) { qrCodeImg ->
|
||||
runOnUiThread {
|
||||
if (qrCodeImg.isNullOrBlank()) {
|
||||
ToastUtils.showToast("获取二维码失败")
|
||||
//ToastUtils.showToast("获取二维码失败")
|
||||
return@runOnUiThread
|
||||
}
|
||||
block(qrCodeImg)
|
||||
@@ -218,7 +207,7 @@ class PayActivity : BaseActivity<ActivityPayBinding>() {
|
||||
userViewModel.memberPay(param) {
|
||||
runOnUiThread {
|
||||
if (it.not()) {
|
||||
ToastUtils.showToast("支付失败,请稍后重试")
|
||||
//ToastUtils.showToast("支付失败,请稍后重试")
|
||||
return@runOnUiThread
|
||||
}
|
||||
block()
|
||||
@@ -242,14 +231,72 @@ class PayActivity : BaseActivity<ActivityPayBinding>() {
|
||||
binding.llPayTab.gone()
|
||||
}
|
||||
|
||||
fun getMemberInfoByPhone(phone: String, key: String, block: (MemberInfo?) -> Unit) {
|
||||
userViewModel.getMemberInfoByPhone(phone, key) { memberInfo ->
|
||||
runOnUiThread {
|
||||
block(memberInfo)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun getMemberInfoById(userId: String, block: (MemberInfo?) -> Unit) {
|
||||
userViewModel.getMemberInfoById(memberId = userId) { memberInfo ->
|
||||
runOnUiThread {
|
||||
block(memberInfo)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// private val intervalExecutor by lazy { IntervalExecutor() }
|
||||
// private var payTaskJob: Job? = null
|
||||
// fun paySuccessCallback() {
|
||||
// payTaskJob = intervalExecutor.startIntervalTaskWithInitialDelay(5000, 10000) {
|
||||
//
|
||||
fun bindOrder(userId: String, block: (Boolean) -> Unit) {
|
||||
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 ->
|
||||
runOnUiThread {
|
||||
block(bindResult)
|
||||
}
|
||||
}
|
||||
}
|
||||
// fun bindOrder(userId: String, block: () -> Unit) {
|
||||
// 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 ->
|
||||
// runOnUiThread {
|
||||
// if (bindResult.not()) {
|
||||
// hideWaitingDialog()
|
||||
// //ToastUtils.showToast("订单绑定失败")
|
||||
// return@runOnUiThread
|
||||
// }
|
||||
// binding.root.postDelayed({
|
||||
// hideWaitingDialog()
|
||||
// showPayInfo(type = 1, isVip = true, memberInfo = memberInfo)
|
||||
// hidePayTab()
|
||||
// block()
|
||||
// }, 1000)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// fun getMemberInfoByPhone(phone: String, key: String, block: (MemberInfo) -> Unit) {
|
||||
// userViewModel.getMemberInfoByPhone(phone, key) { memberInfo ->
|
||||
// runOnUiThread {
|
||||
// if (memberInfo == null) {
|
||||
// hideWaitingDialog()
|
||||
// //ToastUtils.showToast("查询会员信息失败,请稍后重试")
|
||||
// return@runOnUiThread
|
||||
// }
|
||||
// block(memberInfo)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// fun getMemberInfo(userId: String, block: (MemberInfo) -> Unit) {
|
||||
// userViewModel.getMemberInfoById(memberId = userId) { memberInfo ->
|
||||
// runOnUiThread {
|
||||
// if (memberInfo == null) {
|
||||
// hideWaitingDialog()
|
||||
// //ToastUtils.showToast("查询会员信息失败,请稍后重试")
|
||||
// return@runOnUiThread
|
||||
// }
|
||||
// block(memberInfo)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
}
|
||||
@@ -10,7 +10,6 @@ import android.view.inputmethod.EditorInfo
|
||||
import android.view.inputmethod.InputMethodManager
|
||||
import android.widget.Toast
|
||||
import androidx.camera.view.PreviewView
|
||||
import androidx.core.net.toUri
|
||||
import androidx.core.view.updateLayoutParams
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
@@ -40,14 +39,13 @@ import kotlinx.coroutines.launch
|
||||
import okhttp3.RequestBody
|
||||
import okhttp3.RequestBody.Companion.toRequestBody
|
||||
import timber.log.Timber
|
||||
import java.io.File
|
||||
import kotlin.getValue
|
||||
|
||||
class CollectFragment : BaseFragment<FragmentCollectBinding>() {
|
||||
|
||||
companion object {
|
||||
private const val TAG = "CollectFragment"
|
||||
const val MAX_COUNT = 100
|
||||
const val MAX_COUNT = 102
|
||||
}
|
||||
private var selectedFoodId: String? = ""
|
||||
private var selectedFoodName: String? = ""
|
||||
@@ -339,8 +337,11 @@ class CollectFragment : BaseFragment<FragmentCollectBinding>() {
|
||||
private fun clearData() {
|
||||
foodCollectionList.forEach {
|
||||
it.bitmap = null
|
||||
it.imageVector = null
|
||||
it.imageFile = null
|
||||
it.isShowCamera = true
|
||||
it.isFinish = false
|
||||
it.uploadSuccess = false
|
||||
}
|
||||
collectionAdapter.notifyDataSetChanged()
|
||||
|
||||
|
||||
@@ -13,9 +13,9 @@ import com.sw.plate.utils.ToastUtils
|
||||
|
||||
class CashPayFragment : BaseFragment<FragmentCashPayBinding>() {
|
||||
|
||||
private var payActivity: PayActivity? = null
|
||||
private lateinit var payActivity: PayActivity
|
||||
private var foodName: String? = null
|
||||
private var payAmount: String? = null
|
||||
private var payAmount: Double? = null
|
||||
|
||||
var presentation: CashPayPresentation? = null
|
||||
|
||||
@@ -24,20 +24,21 @@ class CashPayFragment : BaseFragment<FragmentCashPayBinding>() {
|
||||
}
|
||||
|
||||
override fun initialize() {
|
||||
payActivity = requireActivity() as? PayActivity
|
||||
|
||||
foodName = payActivity?.foodInfo?.foodName
|
||||
payAmount = payActivity?.foodInfo?.specPrice.format2String(2)
|
||||
binding.tvRealAmount.text = getAmountText(payAmount?:"")
|
||||
payActivity = requireActivity() as PayActivity
|
||||
payActivity.foodInfo?.let {
|
||||
foodName = it.foodName
|
||||
payAmount = (it.specPrice?:0.0) * payActivity.eatNum
|
||||
}
|
||||
binding.tvRealAmount.text = getAmountText(payAmount.format2String(2))
|
||||
|
||||
binding.btnConfirmPayFinish.setOnClickListener {
|
||||
payActivity?.cashPay(hashMapOf(
|
||||
payActivity.cashPay(hashMapOf(
|
||||
//标价金额(单位为元)
|
||||
"totalFee" to (payAmount?:""),
|
||||
"totalFee" to payAmount.format2String(2),
|
||||
//订单类型(0付款1会员充值)
|
||||
"orderType" to "0",
|
||||
//商户订单号
|
||||
"orderNo" to (payActivity?.foodOrderId?:""),
|
||||
"orderNo" to payActivity.foodOrderId,
|
||||
//支付来源:0线下收款 、3:线上纯会员支付 101:支付宝主动、102:支付宝被动、201:微信主动、202:微信被动
|
||||
"paySource" to "0"
|
||||
)) { paySuccess ->
|
||||
@@ -45,7 +46,7 @@ class CashPayFragment : BaseFragment<FragmentCashPayBinding>() {
|
||||
ToastUtils.showToast("接口调用失败")
|
||||
return@cashPay
|
||||
}
|
||||
payActivity?.showPaySuccess( false)
|
||||
payActivity.showPaySuccess( false)
|
||||
}
|
||||
}
|
||||
showSubScreen()
|
||||
@@ -74,11 +75,11 @@ class CashPayFragment : BaseFragment<FragmentCashPayBinding>() {
|
||||
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
|
||||
it.payAmount = payAmount
|
||||
it.payAmount = payAmount.format2String(2)
|
||||
}
|
||||
presentation?.show()
|
||||
}
|
||||
|
||||
@@ -9,9 +9,9 @@ import com.sw.dualscreen.presentation.pay.FacePayPresentation
|
||||
|
||||
class FacePayFragment : BaseFragment<FragmentFacePayBinding>() {
|
||||
|
||||
private var payActivity: PayActivity? = null
|
||||
private lateinit var payActivity: PayActivity
|
||||
private var foodName: String? = null
|
||||
private var payAmount: String? = null
|
||||
private var payAmount: Double? = null
|
||||
var presentation: FacePayPresentation? = null
|
||||
override fun inflateViewBinding(): FragmentFacePayBinding {
|
||||
return FragmentFacePayBinding.inflate(layoutInflater)
|
||||
@@ -22,8 +22,10 @@ class FacePayFragment : BaseFragment<FragmentFacePayBinding>() {
|
||||
// binding.tvFaceState.setOnClickListener {
|
||||
// payActivity?.showPayResult()
|
||||
// }
|
||||
foodName = payActivity?.foodInfo?.foodName
|
||||
payAmount = payActivity?.foodInfo?.specPrice.format2String(2)
|
||||
payActivity.foodInfo?.let {
|
||||
foodName = it.foodName
|
||||
payAmount = (it.vipPrice?:0.0) * payActivity.eatNum
|
||||
}
|
||||
showSubScreen()
|
||||
}
|
||||
|
||||
@@ -56,16 +58,16 @@ class FacePayFragment : BaseFragment<FragmentFacePayBinding>() {
|
||||
// 查找副屏(通常索引为1)
|
||||
if (displays.size > 1) {
|
||||
presentation = FacePayPresentation(
|
||||
activity = payActivity!!,
|
||||
activity = payActivity,
|
||||
display = displays[1],
|
||||
userViewModel = payActivity!!.userViewModel,
|
||||
recognizeViewModel = payActivity!!.recognizeViewModel,
|
||||
userViewModel = payActivity.userViewModel,
|
||||
recognizeViewModel = payActivity.recognizeViewModel,
|
||||
// parentTextureView = binding.parentTextureView,
|
||||
) {
|
||||
presentation?.dismiss()
|
||||
}.also {
|
||||
it.foodName = foodName
|
||||
it.payAmount = payAmount
|
||||
it.payAmount = payAmount.format2String(2)
|
||||
}
|
||||
presentation?.show()
|
||||
}
|
||||
|
||||
@@ -1,28 +1,82 @@
|
||||
package com.sw.dualscreen.activity.fragment.pay
|
||||
|
||||
import com.sw.dualscreen.GlobalKey
|
||||
import com.sw.dualscreen.activity.PayActivity
|
||||
import com.sw.dualscreen.activity.fragment.BaseFragment
|
||||
import com.sw.dualscreen.databinding.FragmentNumberPayBinding
|
||||
import com.sw.dualscreen.ext.format2String
|
||||
import com.sw.dualscreen.ext.hideKeyboard
|
||||
import com.sw.dualscreen.model.response.MemberInfo
|
||||
import com.sw.dualscreen.presentation.pay.CashPayPresentation
|
||||
import com.sw.dualscreen.utils.SPUtil
|
||||
import com.sw.plate.utils.ToastUtils
|
||||
|
||||
class NumberPayFragment: BaseFragment<FragmentNumberPayBinding>() {
|
||||
class NumberPayFragment : BaseFragment<FragmentNumberPayBinding>() {
|
||||
|
||||
private lateinit var payActivity: PayActivity
|
||||
private var foodName: String? = null
|
||||
private var payAmount: String? = null
|
||||
private var payAmount: Double? = null
|
||||
var presentation: CashPayPresentation? = null
|
||||
override fun inflateViewBinding(): FragmentNumberPayBinding {
|
||||
return FragmentNumberPayBinding.inflate(layoutInflater)
|
||||
}
|
||||
|
||||
override fun initialize() {
|
||||
binding.root.hideKeyboard()
|
||||
binding.root.setOnClickListener { v ->
|
||||
v.hideKeyboard()
|
||||
}
|
||||
payActivity = requireActivity() as PayActivity
|
||||
|
||||
foodName = payActivity.foodInfo?.foodName
|
||||
payAmount = "36.80"
|
||||
payActivity.foodInfo?.let {
|
||||
foodName = it.foodName
|
||||
payAmount = (it.specPrice ?: 0.0) * payActivity.eatNum
|
||||
}
|
||||
binding.btnConfirm.setOnClickListener { v ->
|
||||
val phone = binding.etInputPhone.text.toString().trim()
|
||||
val key = binding.etInputNumber.text.toString().trim()
|
||||
if (phone.isBlank() || key.isBlank()) {
|
||||
ToastUtils.showToast("请输入会员验证信息")
|
||||
return@setOnClickListener
|
||||
}
|
||||
payActivity.showWaitingDialog("加载中,请稍后……")
|
||||
v.hideKeyboard()
|
||||
// payActivity.getMemberInfoByPhone(phone, key) { memberInfo ->
|
||||
// payActivity.bindOrder(memberInfo.id?:"") {
|
||||
// ToastUtils.showToast("会员验证成功")
|
||||
// }
|
||||
// }
|
||||
|
||||
payActivity.getMemberInfoByPhone(phone, key) { memberInfo ->
|
||||
if (memberInfo == null) {
|
||||
payActivity.hideWaitingDialog()
|
||||
//ToastUtils.showToast("查询会员信息失败,请稍后重试")
|
||||
return@getMemberInfoByPhone
|
||||
}
|
||||
//绑定订单使用faceUserId
|
||||
payActivity.bindOrder(memberInfo.faceUserId ?: "") { bindResult ->
|
||||
if (bindResult.not()) {
|
||||
payActivity.hideWaitingDialog()
|
||||
//ToastUtils.showToast("订单绑定失败")
|
||||
return@bindOrder
|
||||
}
|
||||
binding.root.postDelayed({
|
||||
payActivity.hideWaitingDialog()
|
||||
payActivity.showPayInfo(type = 1, isVip = true, memberInfo = memberInfo)
|
||||
payActivity.hidePayTab()
|
||||
}, 1000)
|
||||
}
|
||||
}
|
||||
|
||||
// getMemberInfo(phone, key) { memberInfo ->
|
||||
// bindOrder(memberInfo.id ?: "") {
|
||||
// binding.root.postDelayed({
|
||||
// payActivity.hideWaitingDialog()
|
||||
// payActivity.showPayInfo(type = 1, isVip = true, memberInfo = memberInfo)
|
||||
// payActivity.hidePayTab()
|
||||
// }, 1000)
|
||||
// }
|
||||
// }
|
||||
}
|
||||
showSubScreen()
|
||||
}
|
||||
|
||||
@@ -54,9 +108,31 @@ class NumberPayFragment: BaseFragment<FragmentNumberPayBinding>() {
|
||||
presentation?.dismiss()
|
||||
}.also {
|
||||
it.foodName = foodName
|
||||
it.payAmount = payAmount
|
||||
it.payAmount = payAmount.format2String(2)
|
||||
}
|
||||
presentation?.show()
|
||||
}
|
||||
}
|
||||
|
||||
// private fun bindOrder(userId: String, block: () -> Unit) {
|
||||
// payActivity.bindOrder(userId) { bindResult ->
|
||||
// if (bindResult.not()) {
|
||||
// payActivity.hideWaitingDialog()
|
||||
// //ToastUtils.showToast("订单绑定失败")
|
||||
// return@bindOrder
|
||||
// }
|
||||
// block()
|
||||
// }
|
||||
// }
|
||||
// private fun getMemberInfo(phone: String, key: String, block: (MemberInfo) -> Unit) {
|
||||
// payActivity.getMemberInfoByPhone(phone, key) { memberInfo ->
|
||||
// if (memberInfo == null) {
|
||||
// payActivity.hideWaitingDialog()
|
||||
// //ToastUtils.showToast("查询会员信息失败,请稍后重试")
|
||||
// return@getMemberInfoByPhone
|
||||
// }
|
||||
// block(memberInfo)
|
||||
// }
|
||||
// }
|
||||
|
||||
}
|
||||
@@ -42,7 +42,7 @@ class PayResultFragment : BaseFragment<FragmentPayResultBinding>() {
|
||||
return FragmentPayResultBinding.inflate(layoutInflater)
|
||||
}
|
||||
|
||||
private var payActivity: PayActivity? = null
|
||||
private lateinit var payActivity: PayActivity
|
||||
override fun initialize() {
|
||||
payActivity = activity as PayActivity
|
||||
binding.btnBack.setOnClickListener {
|
||||
@@ -54,7 +54,7 @@ class PayResultFragment : BaseFragment<FragmentPayResultBinding>() {
|
||||
}
|
||||
|
||||
if (memberInfo != null) {
|
||||
totalPrice = payActivity?.foodInfo?.vipPrice ?: 0.0
|
||||
totalPrice = (payActivity.foodInfo?.vipPrice ?: 0.0) * payActivity.eatNum
|
||||
binding.layoutVip.visible()
|
||||
balance = (memberInfo!!.topUpBalance ?: 0.0) + (memberInfo!!.rewardBalance ?: 0.0)
|
||||
realPayPrice = if (balance >= totalPrice) 0.0 else totalPrice - balance
|
||||
@@ -62,7 +62,7 @@ class PayResultFragment : BaseFragment<FragmentPayResultBinding>() {
|
||||
loadUserInfo(memberInfo!!)
|
||||
} else {
|
||||
binding.layoutVip.gone()
|
||||
totalPrice = payActivity?.foodInfo?.specPrice ?: 0.0
|
||||
totalPrice = (payActivity.foodInfo?.specPrice ?: 0.0) * payActivity.eatNum
|
||||
}
|
||||
|
||||
when (pageType) {
|
||||
@@ -77,7 +77,7 @@ class PayResultFragment : BaseFragment<FragmentPayResultBinding>() {
|
||||
binding.tvRealAmount.text = SpannedUtils.getAmountText(
|
||||
listOf(
|
||||
TextBean(text = "¥", textSize = 36),
|
||||
TextBean(text = realPayPrice.format2String(2), textSize = 60),
|
||||
TextBean(text = totalPrice.format2String(2), textSize = 60),
|
||||
)
|
||||
)
|
||||
|
||||
@@ -100,12 +100,12 @@ class PayResultFragment : BaseFragment<FragmentPayResultBinding>() {
|
||||
isEnabled = true
|
||||
//点击支付,接口成功打开成功页面
|
||||
setOnClickListener {
|
||||
payActivity?.showWaitingDialog("支付中,请稍后……")
|
||||
payActivity.showWaitingDialog("支付中,请稍后……")
|
||||
memberPay(totalPrice.format2String(2)) {
|
||||
binding.root.postDelayed({
|
||||
payActivity?.hideWaitingDialog()
|
||||
payActivity?.showPaySuccess(true)
|
||||
},1000)
|
||||
payActivity.hideWaitingDialog()
|
||||
payActivity.showPaySuccess(true)
|
||||
}, 1000)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -113,16 +113,18 @@ class PayResultFragment : BaseFragment<FragmentPayResultBinding>() {
|
||||
binding.ivPayQrCode.visible()
|
||||
binding.btnConfirmPay.isEnabled = false
|
||||
val payAmount = totalPrice - balance
|
||||
payActivity?.getQrCodeImg(
|
||||
orderId = payActivity!!.foodOrderId,
|
||||
payActivity.getQrCodeImg(
|
||||
orderId = payActivity.foodOrderId,
|
||||
userId = memberInfo!!.id,
|
||||
totalFee = payAmount.format2String(2)
|
||||
) { qrCodeImg ->
|
||||
binding.ivPayQrCode.load(qrCodeImg)
|
||||
//更新副屏二维码
|
||||
payActivity.updateQrCodeImage(qrCodeImg)
|
||||
}
|
||||
paySuccessCallback {
|
||||
//扫码成功回调打开成功页面,后端处理余额扣除
|
||||
payActivity?.showPaySuccess(true)
|
||||
payActivity.showPaySuccess(true)
|
||||
// if (balance > 0.0) {
|
||||
// memberPay(balance.format2String(2)) {
|
||||
// //扫码成功+会员支付完成后打开成功页面
|
||||
@@ -146,13 +148,15 @@ class PayResultFragment : BaseFragment<FragmentPayResultBinding>() {
|
||||
TextBean(text = remainBalance.format2String(2), textSize = 36),
|
||||
)
|
||||
)
|
||||
binding.tvPayAmount.text = "收款金额 ${realPayPrice.format2String(2)} 元"
|
||||
binding.tvPayInfo.text =
|
||||
"应收 ${totalPrice.format2String(2)} 元,余额扣除 ${expensesBalance.format2String(2)} 元"
|
||||
|
||||
val showTotalPrice = totalPrice.format2String(2)
|
||||
binding.tvPayAmount.text = "收款金额 $showTotalPrice 元"
|
||||
|
||||
val showExpensesBalance = expensesBalance.format2String(2)
|
||||
binding.tvPayInfo.text = "应收 $showTotalPrice 元,余额扣除 $showExpensesBalance 元"
|
||||
} else {
|
||||
binding.tvPayAmount.text = "收款金额 ${totalPrice.format2String(2)} 元"
|
||||
binding.tvPayInfo.text =
|
||||
"应收 ${totalPrice.format2String(2)} 元"
|
||||
binding.tvPayInfo.text = "应收 ${totalPrice.format2String(2)} 元"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,8 +169,10 @@ class PayResultFragment : BaseFragment<FragmentPayResultBinding>() {
|
||||
|
||||
//余额
|
||||
private var balance = 0.0
|
||||
|
||||
//实际支付金额
|
||||
private var realPayPrice = 0.0
|
||||
|
||||
//扣除余额
|
||||
private var expensesBalance = 0.0
|
||||
|
||||
@@ -174,20 +180,41 @@ class PayResultFragment : BaseFragment<FragmentPayResultBinding>() {
|
||||
val list: MutableList<TextBean> = mutableListOf()
|
||||
|
||||
list.add(TextBean(text = "余额扣除 ", textSize = 30, textColor = "#FF889AC2"))
|
||||
list.add(TextBean(text = "-${expensesBalance.format2String(2)}", textSize = 30, textColor = "#FF0A1428"))
|
||||
list.add(
|
||||
TextBean(
|
||||
text = "-${expensesBalance.format2String(2)}",
|
||||
textSize = 30,
|
||||
textColor = "#FF0A1428",
|
||||
isBold = true
|
||||
)
|
||||
)
|
||||
|
||||
if (balance >= totalPrice) {
|
||||
//余额大于等于总价格,使用余额支付
|
||||
TextBean(text = " 元,扣除后可用余额 ", textSize = 30, textColor = "#FF889AC2")
|
||||
list.add(TextBean(text = " 元,扣除后可用余额 ", textSize = 30, textColor = "#FF889AC2"))
|
||||
val remainingBalance = balance - totalPrice
|
||||
TextBean(text = remainingBalance.format2String(2), textSize = 30, textColor = "#FF0A1428")
|
||||
list.add(
|
||||
TextBean(
|
||||
text = remainingBalance.format2String(2),
|
||||
textSize = 30,
|
||||
textColor = "#FF0A1428",
|
||||
isBold = true
|
||||
)
|
||||
)
|
||||
} else {
|
||||
//余额小于总价格,使用余额+扫码支付
|
||||
//实际支付金额
|
||||
TextBean(text = " 元,还需支付 ", textSize = 30, textColor = "#FF889AC2")
|
||||
TextBean(text = realPayPrice.format2String(2), textSize = 30, textColor = "#FF0A1428")
|
||||
TextBean(text = " 元", textSize = 30, textColor = "#FF889AC2")
|
||||
list.add(TextBean(text = " 元,还需支付 ", textSize = 30, textColor = "#FF889AC2"))
|
||||
list.add(
|
||||
TextBean(
|
||||
text = realPayPrice.format2String(2),
|
||||
textSize = 30,
|
||||
textColor = "#FF0A1428",
|
||||
isBold = true
|
||||
)
|
||||
)
|
||||
}
|
||||
list.add(TextBean(text = " 元", textSize = 30, textColor = "#FF889AC2"))
|
||||
|
||||
return list
|
||||
}
|
||||
@@ -204,14 +231,14 @@ class PayResultFragment : BaseFragment<FragmentPayResultBinding>() {
|
||||
phone
|
||||
}
|
||||
|
||||
private fun memberPay(total: String, callback:()-> Unit) {
|
||||
payActivity?.run {
|
||||
private fun memberPay(total: String, callback: () -> Unit) {
|
||||
payActivity.run {
|
||||
memberPay(
|
||||
param = hashMapOf(
|
||||
//支付金额
|
||||
"totalFee" to total,
|
||||
//订单号
|
||||
"orderNo" to payActivity!!.foodOrderId,
|
||||
"orderNo" to payActivity.foodOrderId,
|
||||
//用户id
|
||||
"memberId" to memberInfo!!.id!!
|
||||
),
|
||||
|
||||
@@ -24,7 +24,7 @@ class ScanQrCodePayFragment : BaseFragment<FragmentScanQrcodePayBinding>() {
|
||||
|
||||
private lateinit var payActivity: PayActivity
|
||||
private var foodName: String? = null
|
||||
private var payAmount: String? = null
|
||||
private var payAmount: Double? = null
|
||||
private var payQrCodePic: String? = null
|
||||
var presentation: ScanQrCodePayPresentation? = null
|
||||
private var countDownJob: Job? = null
|
||||
@@ -36,11 +36,16 @@ class ScanQrCodePayFragment : BaseFragment<FragmentScanQrcodePayBinding>() {
|
||||
override fun initialize() {
|
||||
payActivity = requireActivity() as PayActivity
|
||||
|
||||
foodName = payActivity.foodInfo?.foodName
|
||||
payAmount = payActivity.foodInfo?.specPrice.format2String(2)
|
||||
binding.tvRealAmount.text = getAmountText(payAmount ?: "")
|
||||
|
||||
payActivity.getQrCodeImg(orderId = payActivity.foodOrderId, totalFee = payAmount) {
|
||||
payActivity.foodInfo?.let {
|
||||
foodName = it.foodName
|
||||
payAmount = (it.specPrice?:0.0)*payActivity.eatNum
|
||||
}
|
||||
binding.tvRealAmount.text = getAmountText(payAmount.format2String(2))
|
||||
//不需要绑定会员id
|
||||
payActivity.getQrCodeImg(
|
||||
orderId = payActivity.foodOrderId,
|
||||
totalFee = payAmount.format2String(2)
|
||||
) {
|
||||
payQrCodePic = it
|
||||
binding.ivPayQrCode.load(payQrCodePic)
|
||||
binding.tvPayResult.text = "待支付(60s)..."
|
||||
@@ -84,7 +89,7 @@ class ScanQrCodePayFragment : BaseFragment<FragmentScanQrcodePayBinding>() {
|
||||
presentation?.dismiss()
|
||||
}.also {
|
||||
it.foodName = foodName
|
||||
it.totalPrice = payActivity.foodInfo?.specPrice ?: 0.0
|
||||
it.totalPrice = payAmount ?: 0.0
|
||||
it.payQrCodePic = payQrCodePic
|
||||
}
|
||||
presentation?.show()
|
||||
|
||||
@@ -30,12 +30,17 @@ data class FoodOrder(
|
||||
var notPay: Boolean,
|
||||
//备注
|
||||
var remark: String? = "",
|
||||
|
||||
//即放即取-1,称重-2
|
||||
var mode: Int
|
||||
)
|
||||
|
||||
@Parcelize
|
||||
data class MemberInfo(
|
||||
//会员id
|
||||
val id: String?,
|
||||
//刷脸识别用户ID
|
||||
val faceUserId: String?,
|
||||
//手机号
|
||||
val phone: String?,
|
||||
//姓名
|
||||
@@ -53,7 +58,8 @@ data class MemberInfo(
|
||||
data class TextBean(
|
||||
var text: String,
|
||||
var textSize: Int = 0,
|
||||
var textColor: String? = null
|
||||
var textColor: String? = null,
|
||||
var isBold: Boolean = false
|
||||
)
|
||||
|
||||
data class UserNutrition(
|
||||
@@ -105,3 +111,8 @@ data class UserEnergy(
|
||||
var fruitsVegetables:Double,
|
||||
var meatEggs:Double,
|
||||
)
|
||||
|
||||
data class RespCodeMsg(
|
||||
val code: String?,
|
||||
val msg: String?
|
||||
)
|
||||
@@ -213,11 +213,20 @@ interface ApiService {
|
||||
* APP根据id获取会员或员工信息及余额
|
||||
*/
|
||||
@GET
|
||||
suspend fun getMemberInfo(
|
||||
suspend fun getMemberInfoById(
|
||||
@Url url: String = "${GlobalData.appBaseUrl}/terminal/neglect/common/app/getUserInfoBalanceById",
|
||||
@Query("id") memberId: String,
|
||||
): ApiResponse<MemberInfo?>
|
||||
|
||||
/**
|
||||
* 根据手机尾号和密钥查询员工信息及余额
|
||||
*/
|
||||
@POST
|
||||
suspend fun getMemberInfoByPhone(
|
||||
@Url url: String = "${GlobalData.appBaseUrl}/terminal/neglect/common/app/queryUserInfoBalanceByPhone",
|
||||
@Body param: HashMap<String, String>
|
||||
): ApiResponse<MemberInfo?>
|
||||
|
||||
/**
|
||||
* 绑定用户与订单号
|
||||
*/
|
||||
@@ -225,7 +234,8 @@ interface ApiService {
|
||||
suspend fun bindOrder(
|
||||
@Url url: String = "${GlobalData.appBaseUrl}/terminal/neglect/boothMachine/app/bingOrder",
|
||||
@Query("userId") userId: String,
|
||||
@Query("orderNo") orderId: String
|
||||
@Query("orderNo") orderId: String,
|
||||
@Query("mode") mode: Int
|
||||
): ApiResponse<Any?>
|
||||
|
||||
|
||||
|
||||
@@ -121,18 +121,18 @@ class MainScreenPresentation(
|
||||
.d("updateWeight lastWeight = $weight, currentStep = $currentStep, isGoStep1 = $isGoStep1")
|
||||
mealPickupMode = SPUtil.getInstance().get(GlobalKey.KEY_PICKUP_MODE, 0) ?: 0
|
||||
val chargeMode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0)
|
||||
if (mealPickupMode == 1 && chargeMode == 0) {
|
||||
//余量计量+计费模式
|
||||
if (isFirstGetWeight && lastWeight > 5) {
|
||||
recognitionWeight = lastWeight
|
||||
isFirstGetWeight = false
|
||||
}
|
||||
if (lastWeight > 5) {
|
||||
//余量计量,有重量的情况下不回到重新识别状态
|
||||
return
|
||||
}
|
||||
isFirstGetWeight = true
|
||||
}
|
||||
// if (mealPickupMode == 1 && chargeMode == 0) {
|
||||
// //余量计量+计费模式
|
||||
// if (isFirstGetWeight && lastWeight > 5) {
|
||||
// recognitionWeight = lastWeight
|
||||
// isFirstGetWeight = false
|
||||
// }
|
||||
// if (lastWeight > 5) {
|
||||
// //余量计量,有重量的情况下不回到重新识别状态
|
||||
// return
|
||||
// }
|
||||
// isFirstGetWeight = true
|
||||
// }
|
||||
if (currentStep == 2 && lastWeight <= 5 && isGoStep1) {
|
||||
//人脸识别过程中,秤上物品拿走
|
||||
isGoStep1 = false
|
||||
@@ -1109,7 +1109,8 @@ class MainScreenPresentation(
|
||||
activity.createOrder(
|
||||
foodInfo = currentFood!!,
|
||||
foodWeight = lastWeight.roundToInt(),
|
||||
eatWeight = eatWeight.roundToInt()
|
||||
eatWeight = eatWeight.roundToInt(),
|
||||
eatNum = activity.getEatNum(eatWeight, currentFood!!.specWeight)
|
||||
) {
|
||||
if (MyApp.DEBUG) {
|
||||
ToastUtils.showToast("订单已生成")
|
||||
|
||||
@@ -4,36 +4,28 @@ import android.Manifest
|
||||
import android.app.Dialog
|
||||
import android.app.Presentation
|
||||
import android.content.pm.PackageManager
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.Point
|
||||
import android.hardware.Camera
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.text.Spanned
|
||||
import android.text.SpannedString
|
||||
import android.text.TextUtils
|
||||
import android.text.style.AbsoluteSizeSpan
|
||||
import android.view.Display
|
||||
import android.view.TextureView
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.ViewTreeObserver
|
||||
import android.widget.ImageView
|
||||
import android.widget.TextView
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.text.buildSpannedString
|
||||
import androidx.lifecycle.Observer
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import com.arcsoft.face.ErrorInfo
|
||||
import com.sw.dualscreen.GlobalKey
|
||||
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.SPUtil
|
||||
import com.sw.dualscreen.utils.SpannedUtils
|
||||
import com.sw.dualscreen.view.CustomDialog
|
||||
import com.sw.dualscreen.viewmodel.UserViewModel
|
||||
@@ -248,7 +240,7 @@ class FacePayPresentation(
|
||||
// recognitionWeight = lastWeight
|
||||
lastFaceTrackId = compareResult.trackId
|
||||
val faceEntity = compareResult.faceEntity
|
||||
var userId = faceEntity.userName
|
||||
val userId = faceEntity.userName
|
||||
if (userId == null) return@Observer
|
||||
// TODO: 测试支付用户id
|
||||
// userId = "1987710988425662466"
|
||||
@@ -566,77 +558,66 @@ class FacePayPresentation(
|
||||
}
|
||||
|
||||
private var lastFaceTrackId: Int = -1 // 上一次的人脸信息
|
||||
private var mDialogWaiting: CustomDialog? = null
|
||||
|
||||
/**
|
||||
* 显示等待提示框
|
||||
*/
|
||||
fun showWaitingDialog(tip: String?): Dialog? {
|
||||
hideWaitingDialog()
|
||||
val view = View.inflate(activity, R.layout.dialog_waiting, null)
|
||||
if (!TextUtils.isEmpty(tip)) (view.findViewById<View?>(R.id.tvTip) as TextView).text = tip
|
||||
mDialogWaiting = CustomDialog(activity, view, R.style.MyDialog)
|
||||
mDialogWaiting!!.show()
|
||||
mDialogWaiting!!.setCancelable(true)
|
||||
return mDialogWaiting
|
||||
}
|
||||
|
||||
/**
|
||||
* 隐藏等待提示框
|
||||
*/
|
||||
fun hideWaitingDialog() {
|
||||
mDialogWaiting?.dismiss()
|
||||
mDialogWaiting = null
|
||||
}
|
||||
|
||||
override fun onDisplayRemoved() {
|
||||
super.onDisplayRemoved()
|
||||
onDismissListener()
|
||||
}
|
||||
|
||||
|
||||
private fun faceRecSuccess(userId: String) {
|
||||
activity.runOnUiThread {
|
||||
showWaitingDialog("加载中,请稍后……")
|
||||
activity.showWaitingDialog("加载中,请稍后……")
|
||||
}
|
||||
activity.getMemberInfoById(userId) { memberInfo ->
|
||||
if (memberInfo == null) {
|
||||
activity.hideWaitingDialog()
|
||||
//ToastUtils.showToast("查询会员信息失败,请稍后重试")
|
||||
return@getMemberInfoById
|
||||
}
|
||||
activity.bindOrder(memberInfo.faceUserId?:"") { bindResult ->
|
||||
if (bindResult.not()) {
|
||||
activity.hideWaitingDialog()
|
||||
//ToastUtils.showToast("订单绑定失败")
|
||||
return@bindOrder
|
||||
}
|
||||
getMemberInfo(userId) { memberInfo ->
|
||||
bindOrder(userId) {
|
||||
binding.root.postDelayed({
|
||||
hideWaitingDialog()
|
||||
activity.hideWaitingDialog()
|
||||
activity.showPayInfo(type = 1, isVip = true, memberInfo = memberInfo)
|
||||
activity.hidePayTab()
|
||||
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)
|
||||
}, 1000)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// private fun bindOrder(userId: String, block: () -> Unit) {
|
||||
// val pickupMode = SPUtil.getInstance().get(GlobalKey.KEY_PICKUP_MODE, 0)
|
||||
// val mode = if (pickupMode == 1) 1 else 2
|
||||
// userViewModel.bindOrder(userId, activity.foodOrderId, mode = mode) { bindResult ->
|
||||
// activity.runOnUiThread {
|
||||
// if (bindResult.not()) {
|
||||
// activity.hideWaitingDialog()
|
||||
// //ToastUtils.showToast("订单绑定失败")
|
||||
// return@runOnUiThread
|
||||
// }
|
||||
// block()
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// private fun getMemberInfo(userId: String, block:(MemberInfo)-> Unit) {
|
||||
// userViewModel.getMemberInfoById(memberId = userId) { memberInfo ->
|
||||
// activity.runOnUiThread {
|
||||
// if (memberInfo == null) {
|
||||
// activity.hideWaitingDialog()
|
||||
// //ToastUtils.showToast("查询会员信息失败,请稍后重试")
|
||||
// return@runOnUiThread
|
||||
// }
|
||||
// block(memberInfo)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
}
|
||||
@@ -74,12 +74,11 @@ class ScanQrCodePayPresentation(
|
||||
1 -> {
|
||||
val memberInfo = activity.memberInfo
|
||||
binding.layoutVip.run {
|
||||
if (memberInfo!=null) visible() else gone()
|
||||
if (memberInfo != null) visible() else gone()
|
||||
}
|
||||
binding.layoutPaySuccess.gone()
|
||||
binding.layoutScanQrCode.visible()
|
||||
|
||||
//totalPrice = if (memberInfo != null) activity.foodInfo?.vipPrice else activity.foodInfo?.specPrice
|
||||
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
|
||||
@@ -110,13 +109,13 @@ class ScanQrCodePayPresentation(
|
||||
2 -> {
|
||||
val memberInfo = activity.memberInfo
|
||||
binding.layoutVip.run {
|
||||
if (memberInfo!=null) visible() else gone()
|
||||
if (memberInfo != null) visible() else gone()
|
||||
}
|
||||
binding.layoutPaySuccess.visible()
|
||||
binding.layoutScanQrCode.gone()
|
||||
|
||||
//totalPrice = activity.foodInfo?.vipPrice ?: 0.0
|
||||
balance = if (memberInfo != null) (memberInfo.topUpBalance ?: 0.0)+(memberInfo.rewardBalance ?: 0.0) else 0.0
|
||||
balance = if (memberInfo != null) (memberInfo.topUpBalance
|
||||
?: 0.0) + (memberInfo.rewardBalance ?: 0.0) else 0.0
|
||||
realPayPrice = if (balance >= totalPrice) 0.0 else totalPrice - balance
|
||||
expensesBalance = if (balance >= totalPrice) totalPrice else balance
|
||||
|
||||
@@ -136,6 +135,10 @@ class ScanQrCodePayPresentation(
|
||||
}
|
||||
}
|
||||
|
||||
fun loadQrCodeImage(qrCodeUrl: String?) {
|
||||
binding.ivPayQrCode.load(qrCodeUrl)
|
||||
}
|
||||
|
||||
private fun loadUserInfo(item: MemberInfo) {
|
||||
binding.ivHeadPic.load(item.faceUrl?.ifBlank { R.drawable.ic_avatar_default })
|
||||
binding.tvUserName.text = item.name
|
||||
@@ -154,24 +157,37 @@ class ScanQrCodePayPresentation(
|
||||
TextBean(
|
||||
text = "-${expensesBalance.format2String(2)}",
|
||||
textSize = 30,
|
||||
textColor = "#FF0A1428"
|
||||
textColor = "#FF0A1428",
|
||||
isBold = true
|
||||
)
|
||||
)
|
||||
|
||||
if (balance >= totalPrice) {
|
||||
//余额大于等于总价格,使用余额支付
|
||||
TextBean(text = " 元,扣除后可用余额 ", textSize = 30, textColor = "#FF5E7585")
|
||||
list.add(TextBean(text = " 元,扣除后可用余额 ", textSize = 30, textColor = "#FF5E7585"))
|
||||
val remainingBalance = balance - totalPrice
|
||||
list.add(
|
||||
TextBean(
|
||||
text = remainingBalance.format2String(2), textSize = 30, textColor = "#FF0A1428"
|
||||
text = remainingBalance.format2String(2),
|
||||
textSize = 30,
|
||||
textColor = "#FF0A1428",
|
||||
isBold = true
|
||||
)
|
||||
)
|
||||
} else {
|
||||
//余额小于总价格,使用余额+扫码支付
|
||||
//实际支付金额
|
||||
TextBean(text = " 元,还需支付 ", textSize = 30, textColor = "#FF5E7585")
|
||||
TextBean(text = realPayPrice.format2String(2), textSize = 30, textColor = "#FF0A1428")
|
||||
TextBean(text = " 元", textSize = 30, textColor = "#FF5E7585")
|
||||
list.add(TextBean(text = " 元,还需支付 ", textSize = 30, textColor = "#FF5E7585"))
|
||||
list.add(
|
||||
TextBean(
|
||||
text = realPayPrice.format2String(2),
|
||||
textSize = 30,
|
||||
textColor = "#FF0A1428",
|
||||
isBold = true
|
||||
)
|
||||
)
|
||||
}
|
||||
list.add(TextBean(text = " 元", textSize = 30, textColor = "#FF5E7585"))
|
||||
|
||||
return list
|
||||
}
|
||||
|
||||
@@ -2,6 +2,8 @@ package com.sw.dualscreen.repository
|
||||
|
||||
import com.google.gson.JsonParseException
|
||||
import com.sw.dualscreen.model.response.ApiResponse
|
||||
import com.sw.dualscreen.model.response.RespCodeMsg
|
||||
import com.sw.dualscreen.utils.GsonUtils
|
||||
import retrofit2.HttpException
|
||||
import timber.log.Timber
|
||||
import java.io.IOException
|
||||
@@ -18,7 +20,13 @@ abstract class BaseRepository {
|
||||
|
||||
when (e) {
|
||||
is HttpException -> {
|
||||
val respData = e.response()?.errorBody()?.string()
|
||||
val respCodeMsg = GsonUtils.fromJson(respData, RespCodeMsg::class.java)
|
||||
if (respCodeMsg?.msg.isNullOrBlank()) {
|
||||
ApiResponse(code = "${e.code()}", msg = e.message())
|
||||
} else {
|
||||
ApiResponse(code = respCodeMsg.code ?:"-10", msg = respCodeMsg.msg)
|
||||
}
|
||||
}
|
||||
|
||||
is SocketTimeoutException -> {
|
||||
|
||||
@@ -222,15 +222,33 @@ class RemoteRepository constructor(
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun bindOrder(userId: String, orderId: String): ApiResponse<Any?> {
|
||||
/**
|
||||
* 绑定订单
|
||||
*/
|
||||
suspend fun bindOrder(userId: String, orderId: String, mode: Int): ApiResponse<Any?> {
|
||||
return safeApiCall {
|
||||
apiService.bindOrder(userId = userId, orderId = orderId)
|
||||
apiService.bindOrder(userId = userId, orderId = orderId, mode = mode)
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun getMemberInfo(memberId: String): ApiResponse<MemberInfo?> {
|
||||
/**
|
||||
* 根据id查询会员信息
|
||||
*/
|
||||
suspend fun getMemberInfoById(memberId: String): ApiResponse<MemberInfo?> {
|
||||
return safeApiCall {
|
||||
apiService.getMemberInfo(memberId = memberId)
|
||||
apiService.getMemberInfoById(memberId = memberId)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id查询会员信息
|
||||
*/
|
||||
suspend fun getMemberInfoByPhone(phone: String, key: String): ApiResponse<MemberInfo?> {
|
||||
return safeApiCall {
|
||||
apiService.getMemberInfoByPhone(param = hashMapOf(
|
||||
"phone" to phone,
|
||||
"password" to key
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
package com.sw.dualscreen.utils
|
||||
|
||||
import android.graphics.Typeface
|
||||
import android.text.Spanned
|
||||
import android.text.SpannedString
|
||||
import android.text.style.AbsoluteSizeSpan
|
||||
import android.text.style.ForegroundColorSpan
|
||||
import android.text.style.StyleSpan
|
||||
import androidx.core.graphics.toColorInt
|
||||
import androidx.core.text.buildSpannedString
|
||||
import com.sw.dualscreen.model.response.TextBean
|
||||
@@ -24,6 +26,9 @@ object SpannedUtils {
|
||||
if (it.textColor.isNullOrBlank().not()) {
|
||||
setSpan(ForegroundColorSpan(it.textColor!!.toColorInt()), start, end, SPAN_FLAGS)
|
||||
}
|
||||
if (it.isBold) {
|
||||
setSpan(StyleSpan(Typeface.BOLD), start, end, SPAN_FLAGS)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,12 +9,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.objbox.CollectedFoodInfo
|
||||
import com.sw.dualscreen.utils.GsonUtils
|
||||
import com.sw.dualscreen.utils.SPUtil
|
||||
import com.sw.plate.App
|
||||
import com.sw.plate.utils.Base64
|
||||
@@ -277,10 +275,16 @@ class UserViewModel : BaseViewModel() {
|
||||
/**
|
||||
* 获取支付二维码
|
||||
*/
|
||||
fun getQrCodeImg(orderId: String, userId: String? = null, totalFee: String?=null, block: (String?) -> Unit) {
|
||||
fun getQrCodeImg(
|
||||
orderId: String,
|
||||
userId: String? = null,
|
||||
totalFee: String? = null,
|
||||
block: (String?) -> Unit
|
||||
) {
|
||||
Timber.tag(TAG).d("getQrCodeImg orderId = $orderId, userId = $userId")
|
||||
launch {
|
||||
val response = repository.getQrCodeImg(orderNo = orderId, memberId = userId, totalFee = totalFee)
|
||||
val response =
|
||||
repository.getQrCodeImg(orderNo = orderId, memberId = userId, totalFee = totalFee)
|
||||
if (parseResponse(response)) {
|
||||
block(response.data)
|
||||
} else {
|
||||
@@ -419,10 +423,10 @@ class UserViewModel : BaseViewModel() {
|
||||
/**
|
||||
* 绑定订单
|
||||
*/
|
||||
fun bindOrder(userId: String, orderId: String, block: (Boolean) -> Unit) {
|
||||
fun bindOrder(userId: String, orderId: String, mode: Int, block: (Boolean) -> Unit) {
|
||||
Timber.tag(TAG).d("bindOrder")
|
||||
launchWithLoading {
|
||||
val response = repository.bindOrder(userId = userId, orderId = orderId)
|
||||
val response = repository.bindOrder(userId = userId, orderId = orderId, mode =mode)
|
||||
if (parseResponse(response)) {
|
||||
block(true)
|
||||
} else {
|
||||
@@ -431,10 +435,22 @@ class UserViewModel : BaseViewModel() {
|
||||
}
|
||||
}
|
||||
|
||||
fun getMemberInfo(memberId: String, block: (MemberInfo?) -> Unit) {
|
||||
fun getMemberInfoById(memberId: String, block: (MemberInfo?) -> Unit) {
|
||||
Timber.tag(TAG).d("getMemberInfo")
|
||||
launchWithLoading {
|
||||
val response = repository.getMemberInfo(memberId)
|
||||
val response = repository.getMemberInfoById(memberId)
|
||||
if (parseResponse(response)) {
|
||||
block(response.data)
|
||||
} else {
|
||||
block(null)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun getMemberInfoByPhone(phone: String, key: String, block: (MemberInfo?) -> Unit) {
|
||||
Timber.tag(TAG).d("getMemberInfo")
|
||||
launchWithLoading {
|
||||
val response = repository.getMemberInfoByPhone(phone, key)
|
||||
if (parseResponse(response)) {
|
||||
block(response.data)
|
||||
} else {
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:state_checked="true">
|
||||
<shape android:shape="rectangle">
|
||||
<solid android:color="#FFFF3232"/>
|
||||
<size android:width="120dp" android:height="5dp"/>
|
||||
<corners android:radius="5dp"/>
|
||||
</shape>
|
||||
</item>
|
||||
<item android:state_checked="false">
|
||||
<shape android:shape="rectangle">
|
||||
<solid android:color="@color/transparent"/>
|
||||
<size android:width="120dp" android:height="5dp"/>
|
||||
<corners android:radius="5dp"/>
|
||||
</shape>
|
||||
</item>
|
||||
</selector>
|
||||
@@ -31,6 +31,7 @@
|
||||
android:text="经营设置"
|
||||
android:textColor="@color/setting_radio"
|
||||
android:textSize="30sp"
|
||||
android:drawableBottom="@drawable/line_shape_horizontal"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<RadioButton
|
||||
@@ -46,6 +47,7 @@
|
||||
android:text="餐品采集"
|
||||
android:textColor="@color/setting_radio"
|
||||
android:textSize="30sp"
|
||||
android:drawableBottom="@drawable/line_shape_horizontal"
|
||||
android:textStyle="bold" />
|
||||
</RadioGroup>
|
||||
|
||||
|
||||
@@ -53,6 +53,7 @@
|
||||
tools:ignore="Autofill,HardcodedText,LabelFor,TextFields" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatButton
|
||||
android:id="@+id/btnConfirm"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_marginTop="64dp"
|
||||
android:layout_marginHorizontal="64dp"
|
||||
|
||||
@@ -128,7 +128,7 @@
|
||||
android:layout_width="300dp"
|
||||
android:layout_height="300dp"
|
||||
android:layout_marginVertical="50dp"
|
||||
android:src="@drawable/ic_qrcode"
|
||||
tools:src="@drawable/ic_qrcode"
|
||||
android:visibility="visible" />
|
||||
|
||||
<TextView
|
||||
|
||||
@@ -62,8 +62,8 @@
|
||||
android:text="请扫码支付或出示付款码"
|
||||
android:textColor="#FF5E7585"
|
||||
android:textSize="24sp"
|
||||
android:textStyle="bold"
|
||||
tools:ignore="HardcodedText" />
|
||||
<!-- android:textStyle="bold"-->
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
|
||||
@@ -1,25 +1,26 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
app:cardCornerRadius="5dp"
|
||||
app:cardCornerRadius="8dp"
|
||||
app:cardBackgroundColor="#000000"
|
||||
app:cardPreventCornerOverlap="true">
|
||||
|
||||
|
||||
<TextView
|
||||
android:id="@+id/toast_tv"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:paddingStart="15dp"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingEnd="15dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="28sp" />
|
||||
android:paddingTop="10dp"
|
||||
android:paddingBottom="10dp"
|
||||
android:gravity="center_vertical"
|
||||
android:paddingStart="20dp"
|
||||
android:paddingEnd="20dp"
|
||||
android:textColor="#ffffff"
|
||||
android:textSize="36sp"
|
||||
tools:text="TextView" />
|
||||
|
||||
|
||||
</androidx.cardview.widget.CardView>
|
||||
Reference in New Issue
Block a user