consumer模块完成度95%,检查消费者前端bug并修复
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user