feat(api): 更新API端点并集成人脸数据库导入功能
- 将所有API端点中的/booth路径替换为/serve - 新增searchFood API用于菜品搜索功能 - 新增getCollectVectorPage API用于向量数据分页获取 - 添加FaceDbImporter工具类实现从assets导入人脸数据 - 在初始化活动中集成人脸数据导入功能 - 更新订单创建逻辑适配新的API参数结构 - 重构菜品搜索和订单处理相关API调用 - 添加V2数据模型到V1模型的转换扩展函数 - 更新绑定订单接口以使用新的API端点 - 添加测试模式支持以跳过实际拍照操作
This commit is contained in:
@@ -9,7 +9,6 @@ import com.sw.dualscreen.model.request.v2.PlaceOrderRequest
|
||||
import com.sw.dualscreen.model.response.ApiResponse
|
||||
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.FoodOrderModel
|
||||
import com.sw.dualscreen.model.response.FoodSearchReq
|
||||
import com.sw.dualscreen.model.response.MemberInfo
|
||||
@@ -19,6 +18,9 @@ import com.sw.dualscreen.model.response.v2.FaceVO
|
||||
import com.sw.dualscreen.model.response.v2.NewFoodInfo
|
||||
import com.sw.dualscreen.model.response.v2.NewMemberInfo
|
||||
import com.sw.dualscreen.model.response.v2.SettlementOrder
|
||||
import com.sw.dualscreen.model.response.v2.toFoodInfo
|
||||
import com.sw.dualscreen.model.response.v2.toFoodOrderModel
|
||||
import com.sw.dualscreen.model.response.v2.toMemberInfo
|
||||
import com.sw.dualscreen.network.ApiClient
|
||||
import com.sw.dualscreen.utils.FileUtil
|
||||
import com.sw.dualscreen.utils.SpTool
|
||||
@@ -152,14 +154,13 @@ class NetViewModelV2 : BaseViewModel() {
|
||||
}
|
||||
|
||||
fun getFoodByNames(
|
||||
nameList: List<String>,
|
||||
deviceType: Int = 2,
|
||||
names: String,
|
||||
onSuccess: (list: List<NewFoodInfo>) -> Unit,
|
||||
onFailure: (message: String) -> Unit
|
||||
) {
|
||||
launch {
|
||||
try {
|
||||
val response = ApiClient.repositoryV2.getFoodByNames(nameList, deviceType)
|
||||
val response = ApiClient.repositoryV2.getFoodByNames(names.split(","))
|
||||
if (parseResponse(response)) {
|
||||
onSuccess(response.data ?: emptyList())
|
||||
} else {
|
||||
@@ -172,26 +173,6 @@ class NetViewModelV2 : BaseViewModel() {
|
||||
}
|
||||
}
|
||||
|
||||
fun getUserCurrentFood(
|
||||
userId: Long,
|
||||
onSuccess: (nutrition: UserNutrition?) -> Unit,
|
||||
onFailure: (message: String) -> Unit
|
||||
) {
|
||||
launch {
|
||||
try {
|
||||
val response = ApiClient.repositoryV2.getUserCurrentFood(userId)
|
||||
if (parseResponse(response)) {
|
||||
onSuccess(response.data)
|
||||
} else {
|
||||
onFailure(response.msg ?: "获取就餐营养数据失败")
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Timber.e(e, "获取就餐营养数据异常")
|
||||
onFailure("网络异常: ${e.message}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun placeOrder(
|
||||
orderRequest: PlaceOrderRequest,
|
||||
onSuccess: (orderNo: String?) -> Unit,
|
||||
@@ -212,87 +193,6 @@ class NetViewModelV2 : BaseViewModel() {
|
||||
}
|
||||
}
|
||||
|
||||
fun getSettlementOrders(
|
||||
userId: Long,
|
||||
onSuccess: (order: SettlementOrder?) -> Unit,
|
||||
onFailure: (message: String) -> Unit
|
||||
) {
|
||||
launch {
|
||||
try {
|
||||
val response = ApiClient.repositoryV2.getSettlementOrders(userId)
|
||||
if (parseResponse(response)) {
|
||||
onSuccess(response.data)
|
||||
} else {
|
||||
onFailure(response.msg ?: "查询结算订单失败")
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Timber.e(e, "查询结算订单异常")
|
||||
onFailure("网络异常: ${e.message}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun getMemberInfo(
|
||||
userId: Long,
|
||||
onSuccess: (memberInfo: NewMemberInfo?) -> Unit,
|
||||
onFailure: (message: String) -> Unit
|
||||
) {
|
||||
launch {
|
||||
try {
|
||||
val response = ApiClient.repositoryV2.getMemberInfo(userId)
|
||||
if (parseResponse(response)) {
|
||||
onSuccess(response.data)
|
||||
} else {
|
||||
onFailure(response.msg ?: "获取会员信息失败")
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Timber.e(e, "获取会员信息异常")
|
||||
onFailure("网络异常: ${e.message}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun getMemberInfoByPhoneV2(
|
||||
phone: String,
|
||||
password: String = "",
|
||||
onSuccess: (memberInfo: NewMemberInfo?) -> Unit,
|
||||
onFailure: (message: String) -> Unit
|
||||
) {
|
||||
launch {
|
||||
try {
|
||||
val response = ApiClient.repositoryV2.getMemberInfoByPhone(phone, password)
|
||||
if (parseResponse(response)) {
|
||||
onSuccess(response.data)
|
||||
} else {
|
||||
onFailure(response.msg ?: "查询会员失败")
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Timber.e(e, "查询会员异常")
|
||||
onFailure("网络异常: ${e.message}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun getMemberDiscount(
|
||||
userId: Long,
|
||||
onSuccess: (discount: String?) -> Unit,
|
||||
onFailure: (message: String) -> Unit
|
||||
) {
|
||||
launch {
|
||||
try {
|
||||
val response = ApiClient.repositoryV2.getMemberDiscount(userId)
|
||||
if (parseResponse(response)) {
|
||||
onSuccess(response.data)
|
||||
} else {
|
||||
onFailure(response.msg ?: "查询会员折扣失败")
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Timber.e(e, "查询会员折扣异常")
|
||||
onFailure("网络异常: ${e.message}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun bindUserOrder(
|
||||
userId: Long,
|
||||
orderNo: String,
|
||||
@@ -337,6 +237,27 @@ class NetViewModelV2 : BaseViewModel() {
|
||||
}
|
||||
}
|
||||
|
||||
fun getCollectVectorPage(
|
||||
pageNum: Long = 1L,
|
||||
pageSize: Long = PAGE_SIZE,
|
||||
onSuccess: (list: List<CollectedFoodV2>) -> Unit,
|
||||
onFailure: (message: String) -> Unit
|
||||
) {
|
||||
launch {
|
||||
try {
|
||||
val response = ApiClient.repositoryV2.getCollectVectorPage(pageNum, pageSize)
|
||||
if (parseResponse(response)) {
|
||||
onSuccess(response.data ?: emptyList())
|
||||
} else {
|
||||
onFailure(response.msg ?: "获取采集列表失败")
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Timber.e(e, "获取采集列表异常")
|
||||
onFailure("网络异常: ${e.message}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** 上传采集图片(suspend,直接返回 picUrls 列表) */
|
||||
suspend fun uploadCollect(
|
||||
foodId: Long,
|
||||
@@ -517,38 +438,22 @@ class NetViewModelV2 : BaseViewModel() {
|
||||
}
|
||||
}
|
||||
|
||||
/** 提交就餐营养数据 */
|
||||
fun postUserNutritionData(
|
||||
param: List<UserNutritionParam>,
|
||||
onSuccess: () -> Unit = {},
|
||||
onFailure: (message: String) -> Unit = {}
|
||||
) {
|
||||
launch {
|
||||
try {
|
||||
val response = repository.postUserNutritionData(param)
|
||||
if (parseResponse(response)) {
|
||||
onSuccess()
|
||||
} else {
|
||||
onFailure(response.msg ?: "提交营养数据失败")
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Timber.e(e, "提交营养数据异常")
|
||||
onFailure("网络异常: ${e.message}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ========== V1 兼容包装方法(暂用 V1 API,后续逐步迁移至 V2) ==========
|
||||
|
||||
private var lastFaceTimestamp = 0L
|
||||
|
||||
/** 搜索食物 */
|
||||
fun searchByFoodName(foodName: String, action: (List<FoodInfo>) -> Unit = {}) {
|
||||
Timber.tag(TAG).d("searchByFoodName foodName = $foodName")
|
||||
Timber.tag(TAG).d("searchFood foodName = $foodName")
|
||||
launchWithLoading {
|
||||
val response = repository.getRestInfoFoodsByType(foodName = foodName)
|
||||
if (parseResponse(response)) {
|
||||
action(response.data ?: emptyList())
|
||||
try {
|
||||
val response = ApiClient.repositoryV2.searchFood(name = foodName)
|
||||
if (parseResponse(response)) {
|
||||
val list = (response.data ?: emptyList()).map { it.toFoodInfo() }
|
||||
action(list)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Timber.e(e, "搜索菜品异常")
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -559,50 +464,42 @@ class NetViewModelV2 : BaseViewModel() {
|
||||
block: (UserNutrition?) -> Unit
|
||||
) {
|
||||
Timber.tag(TAG).d("getUserNutritionData userId = $userId")
|
||||
val uid = userId.toLongOrNull() ?: run {
|
||||
block(null)
|
||||
return
|
||||
}
|
||||
launch {
|
||||
val response = repository.getUserNutritionData(userId = userId)
|
||||
if (parseResponse(response)) {
|
||||
block(response.data)
|
||||
} else {
|
||||
try {
|
||||
val response = ApiClient.repositoryV2.getUserCurrentFood(uid)
|
||||
if (parseResponse(response)) {
|
||||
block(response.data)
|
||||
} else {
|
||||
block(null)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Timber.e(e, "获取就餐营养数据异常")
|
||||
block(null)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** 搜索菜品信息 */
|
||||
fun getFoodInfo(foodName: String, action: (List<FoodInfo>) -> Unit = {}) {
|
||||
Timber.tag(TAG).d("getFoodInfo")
|
||||
launchWithLoading {
|
||||
val response = repository.getFoodInfo(foodName = foodName)
|
||||
if (parseResponse(response)) {
|
||||
action(response.data ?: emptyList())
|
||||
} else {
|
||||
action(emptyList())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** 创建订单 */
|
||||
fun createOrder(order: FoodOrder, block: (String) -> Unit) {
|
||||
Timber.tag(TAG).d("createOrder")
|
||||
launchWithLoading {
|
||||
val response = repository.createOrder(order)
|
||||
if (parseResponse(response)) {
|
||||
block(response.data.toString())
|
||||
} else {
|
||||
block("")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** 获取订单列表 */
|
||||
fun getFoodOrderList(userId: String, block: (FoodOrderModel?) -> Unit) {
|
||||
Timber.tag(TAG).d("getFoodOrderList")
|
||||
Timber.tag(TAG).d("getFoodOrderList userId = $userId")
|
||||
val uid = userId.toLongOrNull() ?: run {
|
||||
block(null)
|
||||
return
|
||||
}
|
||||
launchWithLoading {
|
||||
val response = repository.getFoodOrderList(userId)
|
||||
if (parseResponse(response)) {
|
||||
block(response.data)
|
||||
} else {
|
||||
try {
|
||||
val response = ApiClient.repositoryV2.getSettlementOrders(uid)
|
||||
if (parseResponse(response)) {
|
||||
block(response.data?.toFoodOrderModel())
|
||||
} else {
|
||||
block(null)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Timber.e(e, "查询订单列表异常")
|
||||
block(null)
|
||||
}
|
||||
}
|
||||
@@ -610,12 +507,21 @@ class NetViewModelV2 : BaseViewModel() {
|
||||
|
||||
/** 根据 ID 查询会员信息 */
|
||||
fun getMemberInfoById(memberId: String, block: (MemberInfo?) -> Unit) {
|
||||
Timber.tag(TAG).d("getMemberInfo")
|
||||
Timber.tag(TAG).d("getMemberInfo memberId=$memberId")
|
||||
val uid = memberId.toLongOrNull() ?: run {
|
||||
block(null)
|
||||
return
|
||||
}
|
||||
launchWithLoading {
|
||||
val response = repository.getMemberInfoById(memberId)
|
||||
if (parseResponse(response)) {
|
||||
block(response.data)
|
||||
} else {
|
||||
try {
|
||||
val response = ApiClient.repositoryV2.getMemberInfo(uid)
|
||||
if (parseResponse(response)) {
|
||||
block(response.data?.toMemberInfo())
|
||||
} else {
|
||||
block(null)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Timber.e(e, "查询会员信息异常")
|
||||
block(null)
|
||||
}
|
||||
}
|
||||
@@ -623,38 +529,39 @@ class NetViewModelV2 : BaseViewModel() {
|
||||
|
||||
/** 根据手机号查询会员信息 */
|
||||
fun getMemberInfoByPhone(phone: String, key: String, block: (MemberInfo?) -> Unit) {
|
||||
Timber.tag(TAG).d("getMemberInfoByPhone")
|
||||
Timber.tag(TAG).d("getMemberInfoByPhone phone=$phone")
|
||||
launchWithLoading {
|
||||
val response = repository.getMemberInfoByPhone(phone, key)
|
||||
if (parseResponse(response)) {
|
||||
block(response.data)
|
||||
} else {
|
||||
try {
|
||||
val response = ApiClient.repositoryV2.getMemberInfoByPhone(phone, key)
|
||||
if (parseResponse(response)) {
|
||||
block(response.data?.toMemberInfo())
|
||||
} else {
|
||||
block(null)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Timber.e(e, "查询会员异常")
|
||||
block(null)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** 绑定订单 */
|
||||
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, mode = mode)
|
||||
if (parseResponse(response)) {
|
||||
block(true)
|
||||
} else {
|
||||
block(false)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** 获取会员折扣 */
|
||||
fun getMemberDiscount(userId: String, block: (Double?) -> Unit) {
|
||||
Timber.tag(TAG).d("getMemberDiscount")
|
||||
Timber.tag(TAG).d("getMemberDiscount userId = $userId")
|
||||
val uid = userId.toLongOrNull() ?: run {
|
||||
block(null)
|
||||
return
|
||||
}
|
||||
launchWithLoading {
|
||||
val response = repository.getMemberDiscount(userId)
|
||||
if (parseResponse(response)) {
|
||||
block(response.data)
|
||||
} else {
|
||||
try {
|
||||
val response = ApiClient.repositoryV2.getMemberDiscount(uid)
|
||||
if (parseResponse(response)) {
|
||||
block(response.data?.toDoubleOrNull())
|
||||
} else {
|
||||
block(null)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Timber.e(e, "查询会员折扣异常")
|
||||
block(null)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user