增加支付接口相关逻辑

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
@@ -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("订单已生成")
}
}
}
}