consumer模块完成度95%,检查消费者前端bug并修复

This commit is contained in:
cyh666666
2026-03-09 17:20:59 +08:00
parent 7b5801a72b
commit 2262d1bfd9
128 changed files with 13485 additions and 1670 deletions

View File

@@ -3092,30 +3092,81 @@ class SupabaseService {
// 确认收货
async confirmReceipt(orderId: string): Promise<ConfirmReceiptResponse> {
console.log('[confirmReceipt] 开始确认收货, orderId:', orderId)
try {
const userId = this.getCurrentUserId()
console.log('[confirmReceipt] userId:', userId)
if (userId == null) {
return { success: false, error: '用户未登录' }
}
const updateData = new UTSJSONObject()
updateData.set('order_status', 4)
updateData.set('delivered_at', new Date().toISOString())
updateData.set('completed_at', new Date().toISOString())
updateData.set('updated_at', new Date().toISOString())
console.log('[confirmReceipt] 准备更新订单状态, updateData:', JSON.stringify(updateData))
const response = await supa
.from('ml_orders')
.update({
order_status: 4, // 4: 已完成
delivered_at: new Date().toISOString(),
completed_at: new Date().toISOString(), // 也更新完成时间
updated_at: new Date().toISOString()
})
.update(updateData)
.eq('id', orderId)
.eq('user_id', userId)
.execute()
console.log('[confirmReceipt] response.status:', response.status)
console.log('[confirmReceipt] response.error:', response.error)
console.log('[confirmReceipt] response.data:', JSON.stringify(response.data))
// 检查 HTTP 状态码
if (response.status != null && response.status >= 400) {
// 尝试从 response.data 中提取错误信息
let errorMsg = '请求失败'
if (response.data != null) {
try {
const errorData = response.data as UTSJSONObject
const msg = errorData.getString('message')
if (msg != null) {
errorMsg = msg
}
} catch (e) {
// ignore
}
}
console.log('[confirmReceipt] HTTP错误:', response.status, errorMsg)
return { success: false, error: errorMsg }
}
if (response.error != null) {
return { success: false, error: response.error.message }
}
// 检查 response.data 是否包含错误代码
if (response.data != null) {
try {
const respData = response.data as UTSJSONObject
const errorCode = respData.getString('code')
if (errorCode != null) {
const errorMsg = respData.getString('message') ?? '数据库错误'
console.log('[confirmReceipt] 数据库错误:', errorCode, errorMsg)
return { success: false, error: errorMsg }
}
} catch (e) {
// ignore
}
}
// 检查是否有数据被更新
if (response.data == null || (Array.isArray(response.data) && response.data.length === 0)) {
console.log('[confirmReceipt] 没有数据被更新,可能订单不存在或无权限')
return { success: false, error: '订单不存在或无权限更新' }
}
console.log('[confirmReceipt] 确认收货成功')
return { success: true }
} catch (e: any) {
console.error('[confirmReceipt] 异常:', e)
return { success: false, error: e.message }
}
}
@@ -4108,7 +4159,7 @@ class SupabaseService {
}
}
async getUserBalance(): Promise<number> {
async getUserBalanceNumber(): Promise<number> {
try {
const userId = this.getCurrentUserId()
console.log('[Supabase] getUserBalance userId:', userId)
@@ -6217,22 +6268,30 @@ class SupabaseService {
let productType = ''
// 检查是否是数组,如果是则取第一个元素
let product: any
let productObj: UTSJSONObject | null = null
if (Array.isArray(productRaw)) {
product = productRaw[0]
const arr = productRaw as any[]
if (arr.length > 0) {
const firstItem = arr[0]
if (firstItem instanceof UTSJSONObject) {
productObj = firstItem
} else {
productObj = JSON.parse(JSON.stringify(firstItem)) as UTSJSONObject
}
}
} else {
product = productRaw
if (productRaw instanceof UTSJSONObject) {
productObj = productRaw
} else {
productObj = JSON.parse(JSON.stringify(productRaw)) as UTSJSONObject
}
}
// 尝试 _getValue 方法
if (typeof product._getValue === 'function') {
pointsRequired = (product._getValue('points_required') as number) ?? 0
stock = (product._getValue('stock') as number) ?? 0
productType = (product._getValue('product_type') as string) ?? ''
} else {
pointsRequired = product['points_required'] ?? 0
stock = product['stock'] ?? 0
productType = product['product_type'] ?? ''
// 使用 UTSJSONObject 方法访问属性
if (productObj != null) {
pointsRequired = productObj.getNumber('points_required') ?? 0
stock = productObj.getNumber('stock') ?? 0
productType = productObj.getString('product_type') ?? ''
}
const totalPoints = pointsRequired * quantity
@@ -6280,10 +6339,10 @@ class SupabaseService {
console.log('[exchangeProduct] productId 值:', productId)
console.log('[exchangeProduct] 当前库存:', stock, ', 扣减数量:', quantity)
// 直接使用普通对象字面量(根据 UTS_ANDROID_GUIDE.md
const stockUpdateData: Record<string, any> = {
stock: stock - quantity
}
// 使用 UTSJSONObject 替代 Record<string, any>
const stockUpdateData = new UTSJSONObject()
stockUpdateData.set('stock', stock - quantity)
console.log('[exchangeProduct] stockUpdateData:', stockUpdateData)
console.log('[exchangeProduct] stockUpdateData 类型:', typeof stockUpdateData)
@@ -6365,7 +6424,7 @@ class SupabaseService {
result.set('total', 0)
result.set('page', page)
result.set('limit', limit)
result.set('data', [])
result.set('data', [] as any[])
try {
const userId = this.getCurrentUserId()
@@ -6474,7 +6533,7 @@ class SupabaseService {
result.set('avg_rating', 0)
result.set('good_rate', 0)
result.set('rating_distribution', new UTSJSONObject())
result.set('tags', [])
result.set('tags', [] as any[])
try {
const response = await supa
@@ -6921,7 +6980,7 @@ class SupabaseService {
const result = new UTSJSONObject()
result.set('expiring_points', 0)
result.set('expiring_date', null)
result.set('details', [])
result.set('details', [] as any[])
try {
const userId = this.getCurrentUserId()
@@ -6939,7 +6998,7 @@ class SupabaseService {
.eq('user_id', userId!)
.gt('points', 0)
.eq('is_expired', false)
.not.is('expires_at', null)
.not('expires_at', 'is', null)
.gte('expires_at', nowStr)
.lte('expires_at', laterStr)
.order('expires_at', { ascending: true })
@@ -7087,6 +7146,63 @@ class SupabaseService {
return false
}
// ==================== 推销模式 - 商家配置API ====================
// 获取商家推销配置
async getMerchantPromotionConfig(merchantId: string): Promise<UTSJSONObject> {
const result = new UTSJSONObject()
result.set('promotion_enabled', false)
result.set('share_free_enabled', false)
result.set('distribution_enabled', false)
result.set('required_count', 4)
result.set('reward_type', 'product_price')
result.set('fixed_reward_amount', 0)
try {
const res = await supa
.from('ml_merchant_promotion_config')
.select('*')
.eq('merchant_id', merchantId)
.limit(1)
.execute()
if (res.error == null && res.data != null && Array.isArray(res.data)) {
const arr = res.data as any[]
if (arr.length > 0) {
const item = arr[0]
const itemAny = item as any
if (itemAny instanceof UTSJSONObject) {
result.set('promotion_enabled', itemAny.getBoolean('promotion_enabled') ?? false)
result.set('share_free_enabled', itemAny.getBoolean('share_free_enabled') ?? false)
result.set('distribution_enabled', itemAny.getBoolean('distribution_enabled') ?? false)
result.set('required_count', itemAny.getNumber('required_count') ?? 4)
result.set('reward_type', itemAny.getString('reward_type') ?? 'product_price')
result.set('fixed_reward_amount', itemAny.getNumber('fixed_reward_amount') ?? 0)
}
}
}
} catch (e) {
console.error('获取商家推销配置失败:', e)
}
return result
}
// 检查商家是否开启分享免单
async isShareFreeEnabled(merchantId: string): Promise<boolean> {
try {
const config = await this.getMerchantPromotionConfig(merchantId)
const promotionEnabled = config.get('promotion_enabled')
const shareFreeEnabled = config.get('share_free_enabled')
return (promotionEnabled === true || promotionEnabled === 'true') &&
(shareFreeEnabled === true || shareFreeEnabled === 'true')
} catch (e) {
console.error('检查分享免单状态失败:', e)
return false
}
}
// ==================== 推销模式 - 余额相关API ====================
// 获取用户余额
@@ -7113,11 +7229,11 @@ class SupabaseService {
if (arr.length > 0) {
const item = arr[0]
const itemAny = item as any
if (typeof itemAny._getValue === 'function') {
result.set('balance', (itemAny._getValue('balance') as number) ?? 0)
result.set('frozen_balance', (itemAny._getValue('frozen_balance') as number) ?? 0)
result.set('total_earned', (itemAny._getValue('total_earned') as number) ?? 0)
result.set('total_withdrawn', (itemAny._getValue('total_withdrawn') as number) ?? 0)
if (itemAny instanceof UTSJSONObject) {
result.set('balance', itemAny.getNumber('balance') ?? 0)
result.set('frozen_balance', itemAny.getNumber('frozen_balance') ?? 0)
result.set('total_earned', itemAny.getNumber('total_earned') ?? 0)
result.set('total_withdrawn', itemAny.getNumber('total_withdrawn') ?? 0)
}
}
}
@@ -7179,19 +7295,18 @@ class SupabaseService {
// 生成分享码
const shareCode = this.generateShareCode()
const insertData: Record<string, any> = {
user_id: userId,
product_id: productId,
order_id: orderId,
order_item_id: orderItemId,
share_code: shareCode,
product_name: productName,
product_image: productImage,
product_price: productPrice,
required_count: 4,
current_count: 0,
status: 0
}
const insertData = new UTSJSONObject()
insertData.set('user_id', userId)
insertData.set('product_id', productId)
insertData.set('order_id', orderId)
insertData.set('order_item_id', orderItemId)
insertData.set('share_code', shareCode)
insertData.set('product_name', productName)
insertData.set('product_image', productImage)
insertData.set('product_price', productPrice)
insertData.set('required_count', 4)
insertData.set('current_count', 0)
insertData.set('status', 0)
const res = await supa
.from('ml_share_records')
@@ -7199,11 +7314,27 @@ class SupabaseService {
.execute()
if (res.error != null) {
result.set('message', '创建分享记录失败')
console.error('[createShareRecord] 插入失败:', res.error)
console.error('[createShareRecord] 插入数据:', JSON.stringify(insertData))
result.set('message', '创建分享记录失败: ' + (res.error.message ?? '未知错误'))
return result
}
// 获取插入记录的id
let insertedId = ''
if (res.data != null && Array.isArray(res.data) && res.data.length > 0) {
const inserted = res.data[0]
let insertedObj: UTSJSONObject | null = null
if (inserted instanceof UTSJSONObject) {
insertedObj = inserted
} else {
insertedObj = JSON.parse(JSON.stringify(inserted)) as UTSJSONObject
}
insertedId = insertedObj.getString('id') ?? ''
}
result.set('success', true)
result.set('id', insertedId)
result.set('share_code', shareCode)
result.set('message', '分享创建成功')
return result
@@ -7288,7 +7419,7 @@ class SupabaseService {
async getShareDetail(shareId: string): Promise<UTSJSONObject> {
const result = new UTSJSONObject()
result.set('share_record', null)
result.set('secondary_purchases', [])
result.set('secondary_purchases', [] as any[])
try {
const res = await supa
@@ -7410,10 +7541,10 @@ class SupabaseService {
if (arr.length > 0) {
const item = arr[0]
const itemAny = item as any
if (typeof itemAny._getValue === 'function') {
memberLevel = (itemAny._getValue('member_level') as number) ?? 0
totalSpent = (itemAny._getValue('total_spent') as number) ?? 0
manualLevel = (itemAny._getValue('manual_level') as boolean) ?? false
if (itemAny instanceof UTSJSONObject) {
memberLevel = itemAny.getNumber('member_level') ?? 0
totalSpent = itemAny.getNumber('total_spent') ?? 0
manualLevel = itemAny.getBoolean('manual_level') ?? false
}
}
}
@@ -7433,11 +7564,11 @@ class SupabaseService {
let levelDiscount = 1.0
let levelMinAmount = 0
if (typeof levelAny._getValue === 'function') {
levelId = (levelAny._getValue('id') as number) ?? 0
levelNameStr = (levelAny._getValue('name') as string) ?? ''
levelDiscount = (levelAny._getValue('discount') as number) ?? 1.0
levelMinAmount = (levelAny._getValue('min_amount') as number) ?? 0
if (levelAny instanceof UTSJSONObject) {
levelId = levelAny.getNumber('id') ?? 0
levelNameStr = levelAny.getString('name') ?? ''
levelDiscount = levelAny.getNumber('discount') ?? 1.0
levelMinAmount = levelAny.getNumber('min_amount') ?? 0
}
if (levelId === memberLevel) {
@@ -7483,10 +7614,10 @@ class SupabaseService {
for (let i = 0; i < levels.length; i++) {
const level = levels[i]
const levelAny = level as any
if (typeof levelAny._getValue === 'function') {
const levelId = (levelAny._getValue('id') as number) ?? 0
if (levelAny instanceof UTSJSONObject) {
const levelId = levelAny.getNumber('id') ?? 0
if (levelId === currentLevel) {
return (levelAny._getValue('min_amount') as number) ?? 0
return levelAny.getNumber('min_amount') ?? 0
}
}
}