增加支付接口相关逻辑

This commit is contained in:
2025-12-05 18:03:31 +08:00
parent 8899cae323
commit 04e318f47b
38 changed files with 830 additions and 316 deletions
@@ -121,6 +121,8 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
private fun initData() {
// viewModel.getEquipmentToken()
viewModel.getUserFaceCache(pageNo = 1)
//viewModel.getUserFaceCache2()
// presentation?.step1()
presentation?.step1FoodRecognizing()
}
@@ -219,7 +221,15 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
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<ActivityMainBinding>() {
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<ActivityMainBinding>() {
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()
}
}
}
@@ -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<ActivityPayBinding>() {
@@ -52,13 +53,13 @@ class PayActivity : BaseActivity<ActivityPayBinding>() {
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<ActivityPayBinding>() {
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<String, String>, block: (Boolean) -> Unit) {
userViewModel.cashPay(param) {
runOnUiThread {
block(it)
}
}
}
fun memberPay(param: HashMap<String, String>, block: () -> Unit) {
userViewModel.memberPay(param) {
runOnUiThread {
block()
}
}
}
fun paySuccessCallback(isVip: Boolean, block: () -> Unit = {}) {
userViewModel.paySuccessCallback(queryType = 1, orderId = foodOrderId) {
showPaySuccess(isVip)
block()
}
}
@@ -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<FragmentCashPayBinding>() {
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<FragmentCashPayBinding>() {
}
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<FragmentCashPayBinding>() {
delayDismiss()
return
}
showSubScreen()
//showSubScreen()
}
override fun onDestroy() {
@@ -54,7 +74,7 @@ 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
@@ -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<FragmentFacePayBinding>() {
@@ -22,7 +23,7 @@ class FacePayFragment : BaseFragment<FragmentFacePayBinding>() {
// payActivity?.showPayResult()
// }
foodName = payActivity?.foodInfo?.foodName
payAmount = "36.80"
payAmount = payActivity?.foodInfo?.specPrice.format2String(2)
showSubScreen()
}
@@ -32,7 +33,7 @@ class FacePayFragment : BaseFragment<FragmentFacePayBinding>() {
delayDismiss()
return
}
showSubScreen()
//showSubScreen()
}
override fun onDestroy() {
@@ -32,7 +32,7 @@ class NumberPayFragment: BaseFragment<FragmentNumberPayBinding>() {
delayDismiss()
return
}
showSubScreen()
//showSubScreen()
}
override fun onDestroy() {
@@ -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<FragmentPayResultBinding>() {
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<FragmentPayResultBinding>() {
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<FragmentPayResultBinding>() {
)
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<FragmentPayResultBinding>() {
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<FragmentPayResultBinding>() {
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)
}
}
}
}
@@ -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 payQrCodePic: Any? = null
private var payQrCodePic: String? = null
var presentation: ScanQrCodePayPresentation?=null
private var countDownJob: Job? = null
@@ -37,14 +37,19 @@ class ScanQrCodePayFragment: BaseFragment<FragmentScanQrcodePayBinding>() {
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<FragmentScanQrcodePayBinding>() {
delayDismiss()
return
}
showSubScreen()
//showSubScreen()
}
override fun onDestroy() {
@@ -104,4 +109,5 @@ class ScanQrCodePayFragment: BaseFragment<FragmentScanQrcodePayBinding>() {
}
)
}
}