diff --git a/pages.json b/pages.json index bb5b8600..4ff34df3 100644 --- a/pages.json +++ b/pages.json @@ -1,4 +1,4 @@ -{ +{ "pages": [ { "path": "pages/user/login", diff --git a/pages/main/cart.uvue b/pages/main/cart.uvue index d6fec47a..c75b0412 100644 --- a/pages/main/cart.uvue +++ b/pages/main/cart.uvue @@ -131,11 +131,13 @@ class="recommend-item" @click="navigateToProduct(product)" > - + + + {{ product.name }} ¥{{ product.price }} @@ -1400,16 +1402,24 @@ const goToCheckout = () => { margin-bottom: 12px; } -.recommend-image { +.recommend-image-wrapper { width: 100%; - height: 170px; /* 显式高度 */ - /* aspect-ratio: 1; REMOVED */ - /* object-fit: cover; REMOVED */ + padding-bottom: 100%; + position: relative; border-radius: 8px; - margin-bottom: 8px; + overflow: hidden; background: #f5f5f5; } +.recommend-image { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: 8px; +} + .recommend-name { font-size: 13px; color: #333; @@ -1455,6 +1465,37 @@ const goToCheckout = () => { } /* 响应式布局优化 */ +@media screen and (max-width: 414px) { + .recommend-item { + width: 48%; + } +} + +@media screen and (min-width: 415px) and (max-width: 768px) { + .recommend-item { + width: 48%; + } +} + +@media screen and (min-width: 769px) and (max-width: 1024px) { + .recommend-item { + width: 32%; + } +} + +@media screen and (min-width: 1025px) and (max-width: 1399px) { + .recommend-item { + width: 23%; + } +} + +@media screen and (min-width: 1400px) { + .recommend-item { + width: 18%; + } +} + +/* 保留原有的媒体查询用于其他样式 */ @media screen and (min-width: 768px) { .cart-list, .recommend-section { @@ -1467,10 +1508,6 @@ const goToCheckout = () => { /* gap: 16px; REMOVED */ /* Flex 布局参数调整在下方 update */ } - .recommend-item { - width: 23%; - margin-bottom: 16px; - } } @media screen and (min-width: 1024px) { @@ -1597,13 +1634,9 @@ const goToCheckout = () => { /* grid-template-columns: repeat(5, 1fr); REMOVED */ /* gap: 20px; REMOVED */ } - .recommend-item { - width: 18%; /* 5列 */ - margin-bottom: 20px; - } - .recommend-image { - height: 200px; /* 强制高度 */ + .recommend-image-wrapper { + padding-bottom: 100%; } /* 底部结算栏优化 */ @@ -1638,9 +1671,6 @@ const goToCheckout = () => { .recommend-list { /* grid-template-columns: repeat(6, 1fr); REMOVED */ } - .recommend-item { - width: 15%; /* 6 columns approx */ - } .footer-content { width: 1400px; diff --git a/pages/main/category.uvue b/pages/main/category.uvue index 14215f89..f0396316 100644 --- a/pages/main/category.uvue +++ b/pages/main/category.uvue @@ -85,11 +85,13 @@ class="product-card" @click="navigateToProduct(product)" > - + + + {{ product.name }} ¥{{ product.base_price ?? product.price ?? 0 }} @@ -1053,14 +1055,24 @@ function onScan(): void { margin-bottom: 12px; } -.product-image { +.product-image-wrapper { width: 100%; - height: 170px; + padding-bottom: 100%; + position: relative; border-radius: 8px; - margin-bottom: 8px; + overflow: hidden; background: #f5f5f5; } +.product-image { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: 8px; +} + .product-name { font-size: 13px; color: #333; @@ -1276,8 +1288,8 @@ function onScan(): void { padding: 6px; } - .product-image { - height: 100px; + .product-image-wrapper { + padding-bottom: 100%; } .product-name { @@ -1451,7 +1463,7 @@ function onScan(): void { } .product-name { - font-size: 16px; + font-size: 13px; } .product-spec { @@ -1517,8 +1529,8 @@ function onScan(): void { margin: 1.5%; } - .product-image { - height: 180px; + .product-image-wrapper { + padding-bottom: 100%; } .product-info { @@ -1526,7 +1538,7 @@ function onScan(): void { } .product-name { - font-size: 17px; + font-size: 13px; } .product-spec { diff --git a/pages/main/index.uvue b/pages/main/index.uvue index 068187c6..8958329b 100644 --- a/pages/main/index.uvue +++ b/pages/main/index.uvue @@ -200,11 +200,13 @@ class="product-card" @click="navigateToProduct(product)" > - + + + {{ product.name }} ¥{{ product.price }} @@ -1756,7 +1758,7 @@ const navigateToReminders = () => uni.navigateTo({ url: '/pages/user/reminders' /* gap: 10px; removed for uniapp-x support */ justify-content: space-between; /* use space-between instead of gap */ margin-top: 20px; - min-height: 500px; /* 确保有足够高度触发滚动 */ + min-height: 500px; /* 确保 highlighting 触发滚动 */ padding-bottom: 20px; } @@ -1770,14 +1772,24 @@ const navigateToReminders = () => uni.navigateTo({ url: '/pages/user/reminders' margin-bottom: 12px; } -.product-image { +.product-image-wrapper { width: 100%; - height: 170px; + padding-bottom: 100%; + position: relative; border-radius: 8px; - margin-bottom: 8px; + overflow: hidden; background: #f5f5f5; } +.product-image { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: 8px; +} + .product-name { font-size: 13px; color: #333; @@ -1996,10 +2008,14 @@ const navigateToReminders = () => uni.navigateTo({ url: '/pages/user/reminders' .product-image-container { position: relative; - height: 180px; + width: 100%; + padding-bottom: 100%; } .product-image-container .product-image { + position: absolute; + top: 0; + left: 0; width: 100%; height: 100%; background: white; @@ -2313,6 +2329,10 @@ const navigateToReminders = () => uni.navigateTo({ url: '/pages/user/reminders' /* column-gap: 8px; removed */ } + .product-card { + width: 48%; + } + .recommend-grid .recommend-product { width: 48%; margin: 0 1% 8px 1%; @@ -2334,9 +2354,8 @@ const navigateToReminders = () => uni.navigateTo({ url: '/pages/user/reminders' white-space: nowrap; } - .product-image, - .product-image-container { - height: 140px; /* 稍微减小图片高度适配双列 */ + .product-image-wrapper { + padding-bottom: 100%; } /* 手机端商品卡片极简模式(热销 & 推荐) */ @@ -2359,11 +2378,11 @@ const navigateToReminders = () => uni.navigateTo({ url: '/pages/user/reminders' padding: 6px; /* 极小内边距 */ } - .hot-products .product-image, + .hot-products .product-image-wrapper, .hot-products .product-image-container, - .smart-recommend .product-image, + .smart-recommend .product-image-wrapper, .smart-recommend .product-image-container { - height: 110px; /* 进一步减小图片高度 */ + padding-bottom: 100%; } .hot-products .product-name, @@ -2485,6 +2504,10 @@ const navigateToReminders = () => uni.navigateTo({ url: '/pages/user/reminders' /* column-count: 2; removed */ } + .product-card { + width: 48%; + } + .recommend-grid .recommend-product { width: 47%; } @@ -2549,9 +2572,7 @@ const navigateToReminders = () => uni.navigateTo({ url: '/pages/user/reminders' } .product-card { - /* width: calc((100% - 20px) / 3); */ - width: 32%; /* Fallback for calc */ - /* margin-right: 1.33%; */ + width: 32%; } .recommend-grid .recommend-product { @@ -2587,9 +2608,7 @@ const navigateToReminders = () => uni.navigateTo({ url: '/pages/user/reminders' } .product-card { - /* width: calc((100% - 30px) / 4); */ - width: 23%; - /* margin-right: 2%; */ + width: 23%; } .recommend-grid .recommend-product { @@ -2616,9 +2635,7 @@ const navigateToReminders = () => uni.navigateTo({ url: '/pages/user/reminders' } .product-card { - /* width: calc((100% - 30px) / 4); */ - width: 23%; - /* margin-right: 2%; */ + width: 18%; } .recommend-grid .recommend-product { diff --git a/pagesbackup.json b/pagesbackup.json deleted file mode 100644 index e9d8cf38..00000000 --- a/pagesbackup.json +++ /dev/null @@ -1,688 +0,0 @@ -{ - "pages": [ - { - "path": "pages/user/login", - "style": { - "navigationBarTitleText": "用户登录", - "navigationStyle": "custom" - } - }, -// { -// "path": "pages/mall/admin/homePage/index", -// "style": { -// "navigationBarTitleText": "管理后台", -// "navigationStyle": "custom" -// } -// }, - { - "path": "pages/user/boot", - "style": { - "navigationBarTitleText": "" - } - }, - { - "path": "pages/user/register", - "style": { - "navigationBarTitleText": "注册" - } - }, - { - "path": "pages/user/forgot-password", - "style": { - "navigationBarTitleText": "忘记密码" - } - }, - { - "path": "pages/user/terms", - "style": { - "navigationBarTitleText": "用户协议与隐私政策" - } - }, - { - "path": "pages/user/center", - "style": { - "navigationBarTitleText": "用户中心" - } - }, - { - "path": "pages/user/profile", - "style": { - "navigationBarTitleText": "个人资料" - } - }, - { - "path": "pages/user/change-password", - "style": { - "navigationBarTitleText": "修改密码" - } - }, - { - "path": "pages/user/bind-phone", - "style": { - "navigationBarTitleText": "绑定手机" - } - }, - { - "path": "pages/user/bind-email", - "style": { - "navigationBarTitleText": "绑定邮箱" - } - }, - { - "path": "pages/main/index", - "style": { - "navigationBarTitleText": "首页", - "navigationStyle": "custom", - "enablePullDownRefresh": false - } - }, - { - "path": "pages/main/category", - "style": { - "navigationBarTitleText": "分类", - "navigationStyle": "custom" - } - }, - { - "path": "pages/main/messages", - "style": { - "navigationBarTitleText": "消息", - "navigationStyle": "custom", - "enablePullDownRefresh": true - } - }, - { - "path": "pages/main/cart", - "style": { - "navigationBarTitleText": "购物车", - "navigationStyle": "custom" - } - }, - { - "path": "pages/main/profile", - "style": { - "navigationBarTitleText": "我的", - "navigationStyle": "custom" - } - } - ], - "subPackages": [ - { - "root": "pages/mall/consumer", - "pages": [ - { - "path": "settings", - "style": { - "navigationBarTitleText": "设置" - } - }, - { - "path": "wallet", - "style": { - "navigationBarTitleText": "我的钱包" - } - }, - { - "path": "withdraw", - "style": { - "navigationBarTitleText": "余额提现" - } - }, - { - "path": "search", - "style": { - "navigationBarTitleText": "搜索", - "navigationStyle": "custom" - } - }, - { - "path": "product-detail", - "style": { - "navigationBarTitleText": "商品详情" - } - }, - { - "path": "shop-detail", - "style": { - "navigationBarTitleText": "店铺详情" - } - }, - { - "path": "coupons", - "style": { - "navigationBarTitleText": "我的优惠券" - } - }, - { - "path": "favorites", - "style": { - "navigationBarTitleText": "我的收藏" - } - }, - { - "path": "footprint", - "style": { - "navigationBarTitleText": "我的足迹" - } - }, - { - "path": "address-list", - "style": { - "navigationBarTitleText": "收货地址" - } - }, - { - "path": "address-edit", - "style": { - "navigationBarTitleText": "编辑地址" - } - }, - { - "path": "checkout", - "style": { - "navigationBarTitleText": "确认订单" - } - }, - { - "path": "payment", - "style": { - "navigationBarTitleText": "收银台" - } - }, - { - "path": "payment-success", - "style": { - "navigationBarTitleText": "支付成功", - "navigationStyle": "custom" - } - }, - { - "path": "orders", - "style": { - "navigationBarTitleText": "我的订单", - "enablePullDownRefresh": true - } - }, - { - "path": "order-detail", - "style": { - "navigationBarTitleText": "订单详情" - } - }, - { - "path": "logistics", - "style": { - "navigationBarTitleText": "物流详情" - } - }, - { - "path": "review", - "style": { - "navigationBarTitleText": "评价晒单" - } - }, - { - "path": "refund", - "style": { - "navigationBarTitleText": "退款/售后" - } - }, - { - "path": "apply-refund", - "style": { - "navigationBarTitleText": "申请售后" - } - }, - { - "path": "refund-review", - "style": { - "navigationBarTitleText": "服务评价" - } - }, - { - "path": "chat", - "style": { - "navigationBarTitleText": "客服聊天", - "navigationStyle": "custom" - } - }, -// { -// "path": "subscription/plan-list", -// "style": { -// "navigationBarTitleText": "软件订阅" -// } -// }, -// { -// "path": "subscription/plan-detail", -// "style": { -// "navigationBarTitleText": "订阅详情" -// } -// }, -// { -// "path": "subscription/subscribe-checkout", -// "style": { -// "navigationBarTitleText": "确认订阅" -// } -// }, -// { -// "path": "subscription/my-subscriptions", -// "style": { -// "navigationBarTitleText": "我的订阅" -// } -// }, - { - "path": "subscription/followed-shops", - "style": { - "navigationBarTitleText": "关注店铺" - } - }, - { - "path": "points/index", - "style": { - "navigationBarTitleText": "积分管理" - } - }, - { - "path": "red-packets/index", - "style": { - "navigationBarTitleText": "我的红包" - } - }, - { - "path": "bank-cards/index", - "style": { - "navigationBarTitleText": "银行卡管理" - } - }, - { - "path": "bank-cards/add", - "style": { - "navigationBarTitleText": "添加银行卡" - } - } - ] - } -// { -// "root": "pages/mall/delivery", -// "pages": [ -// { -// "path": "index", -// "style": { -// "navigationBarTitleText": "配送中心", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "order-detail", -// "style": { -// "navigationBarTitleText": "订单详情页", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "profile", -// "style": { -// "navigationBarTitleText": "配送个人中心", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "order-history", -// "style": { -// "navigationBarTitleText": "历史记录", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "earnings", -// "style": { -// "navigationBarTitleText": "收入明细", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "tasks", -// "style": { -// "navigationBarTitleText": "全部任务", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "task-detail", -// "style": { -// "navigationBarTitleText": "任务详情", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "profile-edit", -// "style": { -// "navigationBarTitleText": "编辑个人资料", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "ratings", -// "style": { -// "navigationBarTitleText": "评价", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "vehicle", -// "style": { -// "navigationBarTitleText": "车辆管理", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "vehicle-add", -// "style": { -// "navigationBarTitleText": "添加车辆", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "vehicle-edit", -// "style": { -// "navigationBarTitleText": "编辑车辆", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "help-center", -// "style": { -// "navigationBarTitleText": "帮助中心", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "about", -// "style": { -// "navigationBarTitleText": "关于我们", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "feedback", -// "style": { -// "navigationBarTitleText": "意见反馈", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "test", -// "style": { -// "navigationBarTitleText": "test", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "settings", -// "style": { -// "navigationBarTitleText": "设置", -// "navigationStyle": "custom" -// } -// } -// ] -// }, -// { -// "root": "pages/mall/analytics", -// "pages": [ -// { -// "path": "index", -// "style": { -// "navigationBarTitleText": "数据分析", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "profile", -// "style": { -// "navigationBarTitleText": "数据分析个人中心" -// } -// }, -// { -// "path": "sales-report", -// "style": { -// "navigationBarTitleText": "销售报表" -// } -// }, -// { -// "path": "user-analysis", -// "style": { -// "navigationBarTitleText": "用户分析" -// } -// }, -// { -// "path": "product-insights", -// "style": { -// "navigationBarTitleText": "商品洞察" -// } -// }, -// { -// "path": "delivery-analysis", -// "style": { -// "navigationBarTitleText": "配送效率分析" -// } -// }, -// { -// "path": "coupon-analysis", -// "style": { -// "navigationBarTitleText": "优惠券效果分析" -// } -// }, -// { -// "path": "market-trends", -// "style": { -// "navigationBarTitleText": "市场趋势" -// } -// }, -// { -// "path": "custom-report", -// "style": { -// "navigationBarTitleText": "自定义报表" -// } -// }, -// { -// "path": "report-detail", -// "style": { -// "navigationBarTitleText": "报表详情", -// "enablePullDownRefresh": false -// } -// }, -// { -// "path": "data-detail", -// "style": { -// "navigationBarTitleText": "数据分析详情", -// "enablePullDownRefresh": false -// } -// }, -// { -// "path": "insight-detail", -// "style": { -// "navigationBarTitleText": "数据洞察详情", -// "enablePullDownRefresh": false -// } -// } -// ] -// }, -// { -// "root": "pages/mall/admin", -// "pages": [ -// { -// "path": "user-management", -// "style": { -// "navigationBarTitleText": "用户管理", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "product-management", -// "style": { -// "navigationBarTitleText": "商品管理", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "order-management", -// "style": { -// "navigationBarTitleText": "订单管理", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "finance/record", -// "style": { -// "navigationBarTitleText": "财务管理", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "user-statistics", -// "style": { -// "navigationBarTitleText": "用户统计", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "system-settings", -// "style": { -// "navigationBarTitleText": "系统设置", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "subscription/plan-management", -// "style": { -// "navigationBarTitleText": "订阅方案管理" -// } -// }, -// { -// "path": "subscription/user-subscriptions", -// "style": { -// "navigationBarTitleText": "用户订阅管理" -// } -// }, -// { -// "path": "marketing/coupon/list", -// "style": { -// "navigationBarTitleText": "优惠券列表" -// } -// }, -// { -// "path": "marketing/coupon/receive", -// "style": { -// "navigationBarTitleText": "用户领取记录" -// } -// }, -// { -// "path": "marketing/signin/rule", -// "style": { -// "navigationBarTitleText": "签到规则" -// } -// }, -// { -// "path": "marketing/signin/record", -// "style": { -// "navigationBarTitleText": "签到记录" -// } -// } -// ] -// }, -// { -// "root": "pages/mall/merchant", -// "pages": [ -// { -// "path": "index", -// "style": { -// "navigationBarTitleText": "商家中心", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "product-detail", -// "style": { -// "navigationBarTitleText": "商品管理详情", -// "enablePullDownRefresh": false -// } -// }, -// { -// "path": "profile", -// "style": { -// "navigationBarTitleText": "个人资料" -// } -// } -// ] -// }, -// { -// "root": "pages/mall/service", -// "pages": [ -// { -// "path": "index", -// "style": { -// "navigationBarTitleText": "客服工作台", -// "navigationStyle": "custom" -// } -// }, -// { -// "path": "profile", -// "style": { -// "navigationBarTitleText": "客服个人中心" -// } -// }, -// { -// "path": "ticket-detail", -// "style": { -// "navigationBarTitleText": "工单详情", -// "enablePullDownRefresh": false -// } -// } -// ] -// } - ], - "tabBar": { - "color": "#999999", - "selectedColor": "#ff5000", - "backgroundColor": "#ffffff", - "borderStyle": "black", - "list": [ - { - "pagePath": "pages/main/index", - "text": "首页", - "iconPath": "static/tabbar/home.png", - "selectedIconPath": "static/tabbar/home.png" - }, - { - "pagePath": "pages/main/category", - "text": "分类", - "iconPath": "static/tabbar/category.png", - "selectedIconPath": "static/tabbar/category.png" - }, - { - "pagePath": "pages/main/messages", - "text": "消息", - "iconPath": "static/tabbar/message.png", - "selectedIconPath": "static/tabbar/message.png" - }, - { - "pagePath": "pages/main/cart", - "text": "购物车", - "iconPath": "static/tabbar/cart.png", - "selectedIconPath": "static/tabbar/cart.png" - }, - { - "pagePath": "pages/main/profile", - "text": "我的", - "iconPath": "static/tabbar/user.png", - "selectedIconPath": "static/tabbar/user.png" - } - ] - }, - "globalStyle": { - "navigationBarTextStyle": "black", - "navigationBarTitleText": "mall", - "navigationBarBackgroundColor": "#FFFFFF", - "backgroundColor": "#F8F8F8" - } -} diff --git a/pagess.json b/pagess.json new file mode 100644 index 00000000..bb5b8600 --- /dev/null +++ b/pagess.json @@ -0,0 +1,686 @@ +{ + "pages": [ + { + "path": "pages/user/login", + "style": { + "navigationBarTitleText": "用户登录", + "navigationStyle": "custom" + } + }, + { + "path": "pages/mall/admin/homePage/index", + "style": { + "navigationBarTitleText": "管理后台", + "navigationStyle": "custom" + } + }, + { + "path": "pages/user/boot", + "style": { + "navigationBarTitleText": "" + } + }, + { + "path": "pages/user/register", + "style": { + "navigationBarTitleText": "注册" + } + }, + { + "path": "pages/user/forgot-password", + "style": { + "navigationBarTitleText": "忘记密码" + } + }, + { + "path": "pages/user/terms", + "style": { + "navigationBarTitleText": "用户协议与隐私政策" + } + }, + { + "path": "pages/user/center", + "style": { + "navigationBarTitleText": "用户中心" + } + }, + { + "path": "pages/user/profile", + "style": { + "navigationBarTitleText": "个人资料" + } + }, + { + "path": "pages/user/change-password", + "style": { + "navigationBarTitleText": "修改密码" + } + }, + { + "path": "pages/user/bind-phone", + "style": { + "navigationBarTitleText": "绑定手机" + } + }, + { + "path": "pages/user/bind-email", + "style": { + "navigationBarTitleText": "绑定邮箱" + } + }, + { + "path": "pages/main/index", + "style": { + "navigationBarTitleText": "首页", + "navigationStyle": "custom", + "enablePullDownRefresh": false + } + }, + { + "path": "pages/main/category", + "style": { + "navigationBarTitleText": "分类", + "navigationStyle": "custom" + } + }, + { + "path": "pages/main/messages", + "style": { + "navigationBarTitleText": "消息", + "enablePullDownRefresh": true + } + }, + { + "path": "pages/main/cart", + "style": { + "navigationBarTitleText": "购物车", + "navigationStyle": "custom" + } + }, + { + "path": "pages/main/profile", + "style": { + "navigationBarTitleText": "我的" + } + } + ], + "subPackages": [ + { + "root": "pages/mall/consumer", + "pages": [ + { + "path": "settings", + "style": { + "navigationBarTitleText": "设置" + } + }, + { + "path": "wallet", + "style": { + "navigationBarTitleText": "我的钱包" + } + }, + { + "path": "withdraw", + "style": { + "navigationBarTitleText": "余额提现" + } + }, + { + "path": "search", + "style": { + "navigationBarTitleText": "搜索", + "navigationStyle": "custom" + } + }, + { + "path": "product-detail", + "style": { + "navigationBarTitleText": "商品详情" + } + }, + { + "path": "shop-detail", + "style": { + "navigationBarTitleText": "店铺详情" + } + }, + { + "path": "coupons", + "style": { + "navigationBarTitleText": "我的优惠券" + } + }, + { + "path": "favorites", + "style": { + "navigationBarTitleText": "我的收藏" + } + }, + { + "path": "footprint", + "style": { + "navigationBarTitleText": "我的足迹" + } + }, + { + "path": "address-list", + "style": { + "navigationBarTitleText": "收货地址" + } + }, + { + "path": "address-edit", + "style": { + "navigationBarTitleText": "编辑地址" + } + }, + { + "path": "checkout", + "style": { + "navigationBarTitleText": "确认订单" + } + }, + { + "path": "payment", + "style": { + "navigationBarTitleText": "收银台" + } + }, + { + "path": "payment-success", + "style": { + "navigationBarTitleText": "支付成功", + "navigationStyle": "custom" + } + }, + { + "path": "orders", + "style": { + "navigationBarTitleText": "我的订单", + "enablePullDownRefresh": true + } + }, + { + "path": "order-detail", + "style": { + "navigationBarTitleText": "订单详情" + } + }, + { + "path": "logistics", + "style": { + "navigationBarTitleText": "物流详情" + } + }, + { + "path": "review", + "style": { + "navigationBarTitleText": "评价晒单" + } + }, + { + "path": "refund", + "style": { + "navigationBarTitleText": "退款/售后" + } + }, + { + "path": "apply-refund", + "style": { + "navigationBarTitleText": "申请售后" + } + }, + { + "path": "refund-review", + "style": { + "navigationBarTitleText": "服务评价" + } + }, + { + "path": "chat", + "style": { + "navigationBarTitleText": "客服聊天", + "navigationStyle": "custom" + } + }, + { + "path": "subscription/plan-list", + "style": { + "navigationBarTitleText": "软件订阅" + } + }, + { + "path": "subscription/plan-detail", + "style": { + "navigationBarTitleText": "订阅详情" + } + }, + { + "path": "subscription/subscribe-checkout", + "style": { + "navigationBarTitleText": "确认订阅" + } + }, + { + "path": "subscription/my-subscriptions", + "style": { + "navigationBarTitleText": "我的订阅" + } + }, + { + "path": "subscription/followed-shops", + "style": { + "navigationBarTitleText": "关注店铺" + } + }, + { + "path": "points/index", + "style": { + "navigationBarTitleText": "积分管理" + } + }, + { + "path": "red-packets/index", + "style": { + "navigationBarTitleText": "我的红包" + } + }, + { + "path": "bank-cards/index", + "style": { + "navigationBarTitleText": "银行卡管理" + } + }, + { + "path": "bank-cards/add", + "style": { + "navigationBarTitleText": "添加银行卡" + } + } + ] + }, + { + "root": "pages/mall/delivery", + "pages": [ + { + "path": "index", + "style": { + "navigationBarTitleText": "配送中心", + "navigationStyle": "custom" + } + }, + { + "path": "order-detail", + "style": { + "navigationBarTitleText": "订单详情页", + "navigationStyle": "custom" + } + }, + { + "path": "profile", + "style": { + "navigationBarTitleText": "配送个人中心", + "navigationStyle": "custom" + } + }, + { + "path": "order-history", + "style": { + "navigationBarTitleText": "历史记录", + "navigationStyle": "custom" + } + }, + { + "path": "earnings", + "style": { + "navigationBarTitleText": "收入明细", + "navigationStyle": "custom" + } + }, + { + "path": "tasks", + "style": { + "navigationBarTitleText": "全部任务", + "navigationStyle": "custom" + } + }, + { + "path": "task-detail", + "style": { + "navigationBarTitleText": "任务详情", + "navigationStyle": "custom" + } + }, + { + "path": "profile-edit", + "style": { + "navigationBarTitleText": "编辑个人资料", + "navigationStyle": "custom" + } + }, + { + "path": "ratings", + "style": { + "navigationBarTitleText": "评价", + "navigationStyle": "custom" + } + }, + { + "path": "vehicle", + "style": { + "navigationBarTitleText": "车辆管理", + "navigationStyle": "custom" + } + }, + { + "path": "vehicle-add", + "style": { + "navigationBarTitleText": "添加车辆", + "navigationStyle": "custom" + } + }, + { + "path": "vehicle-edit", + "style": { + "navigationBarTitleText": "编辑车辆", + "navigationStyle": "custom" + } + }, + { + "path": "help-center", + "style": { + "navigationBarTitleText": "帮助中心", + "navigationStyle": "custom" + } + }, + { + "path": "about", + "style": { + "navigationBarTitleText": "关于我们", + "navigationStyle": "custom" + } + }, + { + "path": "feedback", + "style": { + "navigationBarTitleText": "意见反馈", + "navigationStyle": "custom" + } + }, + { + "path": "test", + "style": { + "navigationBarTitleText": "test", + "navigationStyle": "custom" + } + }, + { + "path": "settings", + "style": { + "navigationBarTitleText": "设置", + "navigationStyle": "custom" + } + } + ] + }, + { + "root": "pages/mall/analytics", + "pages": [ + { + "path": "index", + "style": { + "navigationBarTitleText": "数据分析", + "navigationStyle": "custom" + } + }, + { + "path": "profile", + "style": { + "navigationBarTitleText": "数据分析个人中心" + } + }, + { + "path": "sales-report", + "style": { + "navigationBarTitleText": "销售报表" + } + }, + { + "path": "user-analysis", + "style": { + "navigationBarTitleText": "用户分析" + } + }, + { + "path": "product-insights", + "style": { + "navigationBarTitleText": "商品洞察" + } + }, + { + "path": "delivery-analysis", + "style": { + "navigationBarTitleText": "配送效率分析" + } + }, + { + "path": "coupon-analysis", + "style": { + "navigationBarTitleText": "优惠券效果分析" + } + }, + { + "path": "market-trends", + "style": { + "navigationBarTitleText": "市场趋势" + } + }, + { + "path": "custom-report", + "style": { + "navigationBarTitleText": "自定义报表" + } + }, + { + "path": "report-detail", + "style": { + "navigationBarTitleText": "报表详情", + "enablePullDownRefresh": false + } + }, + { + "path": "data-detail", + "style": { + "navigationBarTitleText": "数据分析详情", + "enablePullDownRefresh": false + } + }, + { + "path": "insight-detail", + "style": { + "navigationBarTitleText": "数据洞察详情", + "enablePullDownRefresh": false + } + } + ] + }, + { + "root": "pages/mall/admin", + "pages": [ + { + "path": "user-management", + "style": { + "navigationBarTitleText": "用户管理", + "navigationStyle": "custom" + } + }, + { + "path": "product-management", + "style": { + "navigationBarTitleText": "商品管理", + "navigationStyle": "custom" + } + }, + { + "path": "order-management", + "style": { + "navigationBarTitleText": "订单管理", + "navigationStyle": "custom" + } + }, + { + "path": "finance/record", + "style": { + "navigationBarTitleText": "财务管理", + "navigationStyle": "custom" + } + }, + { + "path": "user-statistics", + "style": { + "navigationBarTitleText": "用户统计", + "navigationStyle": "custom" + } + }, + { + "path": "system-settings", + "style": { + "navigationBarTitleText": "系统设置", + "navigationStyle": "custom" + } + }, + { + "path": "subscription/plan-management", + "style": { + "navigationBarTitleText": "订阅方案管理" + } + }, + { + "path": "subscription/user-subscriptions", + "style": { + "navigationBarTitleText": "用户订阅管理" + } + }, + { + "path": "marketing/coupon/list", + "style": { + "navigationBarTitleText": "优惠券列表" + } + }, + { + "path": "marketing/coupon/receive", + "style": { + "navigationBarTitleText": "用户领取记录" + } + }, + { + "path": "marketing/signin/rule", + "style": { + "navigationBarTitleText": "签到规则" + } + }, + { + "path": "marketing/signin/record", + "style": { + "navigationBarTitleText": "签到记录" + } + } + ] + }, + { + "root": "pages/mall/merchant", + "pages": [ + { + "path": "index", + "style": { + "navigationBarTitleText": "商家中心", + "navigationStyle": "custom" + } + }, + { + "path": "product-detail", + "style": { + "navigationBarTitleText": "商品管理详情", + "enablePullDownRefresh": false + } + }, + { + "path": "profile", + "style": { + "navigationBarTitleText": "个人资料" + } + } + ] + }, + { + "root": "pages/mall/service", + "pages": [ + { + "path": "index", + "style": { + "navigationBarTitleText": "客服工作台", + "navigationStyle": "custom" + } + }, + { + "path": "profile", + "style": { + "navigationBarTitleText": "客服个人中心" + } + }, + { + "path": "ticket-detail", + "style": { + "navigationBarTitleText": "工单详情", + "enablePullDownRefresh": false + } + } + ] + } + ], + "tabBar": { + "color": "#999999", + "selectedColor": "#ff5000", + "backgroundColor": "#ffffff", + "borderStyle": "black", + "list": [ + { + "pagePath": "pages/main/index", + "text": "首页", + "iconPath": "static/tabbar/home.png", + "selectedIconPath": "static/tabbar/home.png" + }, + { + "pagePath": "pages/main/category", + "text": "分类", + "iconPath": "static/tabbar/category.png", + "selectedIconPath": "static/tabbar/category.png" + }, + { + "pagePath": "pages/main/messages", + "text": "消息", + "iconPath": "static/tabbar/message.png", + "selectedIconPath": "static/tabbar/message.png" + }, + { + "pagePath": "pages/main/cart", + "text": "购物车", + "iconPath": "static/tabbar/cart.png", + "selectedIconPath": "static/tabbar/cart.png" + }, + { + "pagePath": "pages/main/profile", + "text": "我的", + "iconPath": "static/tabbar/user.png", + "selectedIconPath": "static/tabbar/user.png" + } + ] + }, + "globalStyle": { + "navigationBarTextStyle": "black", + "navigationBarTitleText": "mall", + "navigationBarBackgroundColor": "#FFFFFF", + "backgroundColor": "#F8F8F8" + } +} \ No newline at end of file diff --git a/unpackage/cache/.app-android/class/META-INF/main-1773805322131.kotlin_module b/unpackage/cache/.app-android/class/META-INF/main-1773805322131.kotlin_module new file mode 100644 index 00000000..070f7eb5 Binary files /dev/null and b/unpackage/cache/.app-android/class/META-INF/main-1773805322131.kotlin_module differ diff --git a/unpackage/cache/.app-android/class/META-INF/main-1773806125077.kotlin_module b/unpackage/cache/.app-android/class/META-INF/main-1773806125077.kotlin_module new file mode 100644 index 00000000..070f7eb5 Binary files /dev/null and b/unpackage/cache/.app-android/class/META-INF/main-1773806125077.kotlin_module differ diff --git a/unpackage/cache/.app-android/class/META-INF/main-1773806280580.kotlin_module b/unpackage/cache/.app-android/class/META-INF/main-1773806280580.kotlin_module new file mode 100644 index 00000000..070f7eb5 Binary files /dev/null and b/unpackage/cache/.app-android/class/META-INF/main-1773806280580.kotlin_module differ diff --git a/unpackage/cache/.app-android/class/META-INF/main-1773806509028.kotlin_module b/unpackage/cache/.app-android/class/META-INF/main-1773806509028.kotlin_module new file mode 100644 index 00000000..070f7eb5 Binary files /dev/null and b/unpackage/cache/.app-android/class/META-INF/main-1773806509028.kotlin_module differ diff --git a/unpackage/cache/.app-android/class/META-INF/main-1773807262780.kotlin_module b/unpackage/cache/.app-android/class/META-INF/main-1773807262780.kotlin_module new file mode 100644 index 00000000..070f7eb5 Binary files /dev/null and b/unpackage/cache/.app-android/class/META-INF/main-1773807262780.kotlin_module differ diff --git a/unpackage/cache/.app-android/class/META-INF/main-1773815711277.kotlin_module b/unpackage/cache/.app-android/class/META-INF/main-1773815711277.kotlin_module new file mode 100644 index 00000000..ef915de2 Binary files /dev/null and b/unpackage/cache/.app-android/class/META-INF/main-1773815711277.kotlin_module differ diff --git a/unpackage/cache/.app-android/class/META-INF/main-1773815744161.kotlin_module b/unpackage/cache/.app-android/class/META-INF/main-1773815744161.kotlin_module new file mode 100644 index 00000000..ef915de2 Binary files /dev/null and b/unpackage/cache/.app-android/class/META-INF/main-1773815744161.kotlin_module differ diff --git a/unpackage/cache/.app-android/class/META-INF/main-1773815836943.kotlin_module b/unpackage/cache/.app-android/class/META-INF/main-1773815836943.kotlin_module new file mode 100644 index 00000000..ef915de2 Binary files /dev/null and b/unpackage/cache/.app-android/class/META-INF/main-1773815836943.kotlin_module differ diff --git a/unpackage/cache/.app-android/class/META-INF/main-1773816532749.kotlin_module b/unpackage/cache/.app-android/class/META-INF/main-1773816532749.kotlin_module new file mode 100644 index 00000000..ef915de2 Binary files /dev/null and b/unpackage/cache/.app-android/class/META-INF/main-1773816532749.kotlin_module differ diff --git a/unpackage/cache/.app-android/class/META-INF/main-1773816697404.kotlin_module b/unpackage/cache/.app-android/class/META-INF/main-1773816697404.kotlin_module new file mode 100644 index 00000000..ef915de2 Binary files /dev/null and b/unpackage/cache/.app-android/class/META-INF/main-1773816697404.kotlin_module differ diff --git a/unpackage/cache/.app-android/class/META-INF/main-1773817546156.kotlin_module b/unpackage/cache/.app-android/class/META-INF/main-1773817546156.kotlin_module new file mode 100644 index 00000000..070f7eb5 Binary files /dev/null and b/unpackage/cache/.app-android/class/META-INF/main-1773817546156.kotlin_module differ diff --git a/unpackage/cache/.app-android/class/META-INF/main-1773817672367.kotlin_module b/unpackage/cache/.app-android/class/META-INF/main-1773817672367.kotlin_module new file mode 100644 index 00000000..ef915de2 Binary files /dev/null and b/unpackage/cache/.app-android/class/META-INF/main-1773817672367.kotlin_module differ diff --git a/unpackage/cache/.app-android/class/META-INF/main-1773817678653.kotlin_module b/unpackage/cache/.app-android/class/META-INF/main-1773817678653.kotlin_module new file mode 100644 index 00000000..ef915de2 Binary files /dev/null and b/unpackage/cache/.app-android/class/META-INF/main-1773817678653.kotlin_module differ diff --git a/unpackage/cache/.app-android/class/META-INF/main-1773818370904.kotlin_module b/unpackage/cache/.app-android/class/META-INF/main-1773818370904.kotlin_module new file mode 100644 index 00000000..070f7eb5 Binary files /dev/null and b/unpackage/cache/.app-android/class/META-INF/main-1773818370904.kotlin_module differ diff --git a/unpackage/cache/.app-android/class/META-INF/main-1773818446712.kotlin_module b/unpackage/cache/.app-android/class/META-INF/main-1773818446712.kotlin_module new file mode 100644 index 00000000..ef915de2 Binary files /dev/null and b/unpackage/cache/.app-android/class/META-INF/main-1773818446712.kotlin_module differ diff --git a/unpackage/cache/.app-android/class/META-INF/main-1773819301511.kotlin_module b/unpackage/cache/.app-android/class/META-INF/main-1773819301511.kotlin_module new file mode 100644 index 00000000..070f7eb5 Binary files /dev/null and b/unpackage/cache/.app-android/class/META-INF/main-1773819301511.kotlin_module differ diff --git a/unpackage/cache/.app-android/class/META-INF/main-1773819441039.kotlin_module b/unpackage/cache/.app-android/class/META-INF/main-1773819441039.kotlin_module new file mode 100644 index 00000000..ef915de2 Binary files /dev/null and b/unpackage/cache/.app-android/class/META-INF/main-1773819441039.kotlin_module differ diff --git a/unpackage/cache/.app-android/class/ktClasss.ser b/unpackage/cache/.app-android/class/ktClasss.ser index 7c669c15..8cb40438 100644 Binary files a/unpackage/cache/.app-android/class/ktClasss.ser and b/unpackage/cache/.app-android/class/ktClasss.ser differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddAddressParams.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddAddressParams.class index 0447bcec..ee10d9d8 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddAddressParams.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddAddressParams.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/Address.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/Address.class index e0e685ef..2c2bfaa4 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/Address.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/Address.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressForm.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressForm.class index 45f7cc8a..44f88816 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressForm.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressForm.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressFormReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressFormReactiveObject.class index df721f8d..7a321aa7 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressFormReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressFormReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressItem.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressItem.class index d90c9ac8..74cff2c3 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressItem.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressItem.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressItemReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressItemReactiveObject.class index c989ddda..9c3886a3 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressItemReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressItemReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressReactiveObject.class index 26b8bade..079d8a3d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressType.class index 28934681..135c585e 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressTypeReactiveObject.class index 1b5bde4b..3b24f9d4 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AddressTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/Address__1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/Address__1.class index 89ccac80..e8d62ba0 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/Address__1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/Address__1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq$Companion$request$1$doOnce$1$1$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq$Companion$request$1$doOnce$1$1$1$1.class index d0ba4cdb..b093ef92 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq$Companion$request$1$doOnce$1$1$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq$Companion$request$1$doOnce$1$1$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq$Companion$request$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq$Companion$request$1.class index 9c60cc5a..3c825208 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq$Companion$request$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq$Companion$request$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq$Companion$upload$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq$Companion$upload$1$1.class index 314e5059..6b7cc136 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq$Companion$upload$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq$Companion$upload$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq$Companion$upload$1$2.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq$Companion$upload$1$2.class index dd19933b..53925917 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq$Companion$upload$1$2.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq$Companion$upload$1$2.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq$Companion.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq$Companion.class index b4747238..0f4762f3 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq$Companion.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq$Companion.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq.class index 59b68f22..d51c82e1 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReq.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReqOptions.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReqOptions.class index 84447b91..21485c85 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReqOptions.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReqOptions.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReqResponse.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReqResponse.class index 3a1caa9d..ccd36b31 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReqResponse.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReqResponse.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReqUploadOptions.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReqUploadOptions.class index a903a371..6079ccbe 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReqUploadOptions.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkReqUploadOptions.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupa$select$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupa$select$1.class index 55429372..18652873 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupa$select$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupa$select$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupa.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupa.class index 43b00973..1c34c30e 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupa.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupa.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaCondition.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaCondition.class index c4197f8f..7ea8a65c 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaCondition.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaCondition.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaQueryBuilder$executeAs$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaQueryBuilder$executeAs$1.class index e44f9ba1..efec3a3c 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaQueryBuilder$executeAs$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaQueryBuilder$executeAs$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaQueryBuilder.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaQueryBuilder.class index 9510eaad..121c97a0 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaQueryBuilder.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaQueryBuilder.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaRealtimeChannel$_checkUpdates$1$1$payload$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaRealtimeChannel$_checkUpdates$1$1$payload$1.class index 177d2731..abfe5896 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaRealtimeChannel$_checkUpdates$1$1$payload$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaRealtimeChannel$_checkUpdates$1$1$payload$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaRealtimeChannel$_checkUpdates$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaRealtimeChannel$_checkUpdates$1.class index cd6ee45d..bc823d25 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaRealtimeChannel$_checkUpdates$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaRealtimeChannel$_checkUpdates$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaRealtimeChannel.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaRealtimeChannel.class index 1e77ba1e..b83d4992 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaRealtimeChannel.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaRealtimeChannel.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaSelectOptions.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaSelectOptions.class index dd770bba..2948d8cc 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaSelectOptions.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaSelectOptions.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaSessionInfo.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaSessionInfo.class index 98274d1d..cea26a53 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaSessionInfo.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaSessionInfo.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaSignInResult.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaSignInResult.class index 33ca0f16..edd25e1a 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaSignInResult.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaSignInResult.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaStorageApi.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaStorageApi.class index 62fdd7f7..ba71409e 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaStorageApi.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaStorageApi.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaStorageBucket$upload$1$formData$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaStorageBucket$upload$1$formData$1.class index 918bbf5b..d9a10a15 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaStorageBucket$upload$1$formData$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaStorageBucket$upload$1$formData$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaStorageBucket.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaStorageBucket.class index 83148db9..0d267e47 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaStorageBucket.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/AkSupaStorageBucket.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/BalanceRecord.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/BalanceRecord.class index 88563a32..1eca6468 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/BalanceRecord.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/BalanceRecord.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/BalanceRecordReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/BalanceRecordReactiveObject.class index f1da834b..c2fc9ed8 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/BalanceRecordReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/BalanceRecordReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCard.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCard.class index b5f84018..d5572668 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCard.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCard.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCardForm.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCardForm.class index 98fe4bff..62dde096 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCardForm.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCardForm.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCardFormReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCardFormReactiveObject.class index de846f27..228fde08 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCardFormReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCardFormReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCardReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCardReactiveObject.class index 614f01d4..0f04991d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCardReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCardReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCard__1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCard__1.class index 734fc936..a8e5d6d1 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCard__1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCard__1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCard__1ReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCard__1ReactiveObject.class index da15ebe0..2ff78bfe 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCard__1ReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/BankCard__1ReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/Brand.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/Brand.class index 6548e837..6dab4980 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/Brand.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/Brand.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/BrandReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/BrandReactiveObject.class index b876b55a..974312be 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/BrandReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/BrandReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/BuyerType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/BuyerType.class index 3237cd82..ef0a7491 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/BuyerType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/BuyerType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/BuyerTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/BuyerTypeReactiveObject.class index 8a34d6fc..87cc461d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/BuyerTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/BuyerTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CalendarDay.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CalendarDay.class index 133edb64..a79b8e1d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CalendarDay.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CalendarDay.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo.class index 42a9a4b2..d95fc8e2 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfoReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfoReactiveObject.class index a1f3aac8..a511e677 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfoReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfoReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__1.class index 96b0dece..8879a25d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__1ReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__1ReactiveObject.class index fc86953c..8f1efad5 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__1ReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__1ReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__2.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__2.class index 08d9881a..9d850ada 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__2.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__2.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__2ReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__2ReactiveObject.class index bf7ea3ea..ed16cb3d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__2ReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__2ReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__3.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__3.class index e96d7478..774e7ca8 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__3.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__3.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__3ReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__3ReactiveObject.class index c522b103..79cfad9e 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__3ReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CapsuleButtonInfo__3ReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CartGroup.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CartGroup.class index 125dbed7..b15ffd5a 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CartGroup.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CartGroup.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CartItem.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CartItem.class index 505a697e..4fcbc760 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CartItem.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CartItem.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/Category.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/Category.class index aa1d2785..e54664ba 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/Category.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/Category.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CategoryReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CategoryReactiveObject.class index 52140ee1..683f638e 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CategoryReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CategoryReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ChatMessage.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ChatMessage.class index 542faf93..a5d98d9d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ChatMessage.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ChatMessage.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ChatRoom.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ChatRoom.class index 7ece3c2f..f14f1757 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ChatRoom.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ChatRoom.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CheckoutItemType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CheckoutItemType.class index 3b96d729..dd02c0d3 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CheckoutItemType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CheckoutItemType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CheckoutItemTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CheckoutItemTypeReactiveObject.class index 9d660ba4..3995a235 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CheckoutItemTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CheckoutItemTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ConfirmReceiptResponse.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ConfirmReceiptResponse.class index d76a3151..2722588b 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ConfirmReceiptResponse.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ConfirmReceiptResponse.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ConsumptionStatsType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ConsumptionStatsType.class index 81417697..bf8493ed 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ConsumptionStatsType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ConsumptionStatsType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ConsumptionStatsTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ConsumptionStatsTypeReactiveObject.class index d1957d34..ebf01c74 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ConsumptionStatsTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ConsumptionStatsTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/Coupon.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/Coupon.class index 6cb389ee..2b3c861f 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/Coupon.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/Coupon.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponReactiveObject.class index b52d93f6..599aa1cc 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponTemplateType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponTemplateType.class index 29a70a0e..d3477ab6 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponTemplateType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponTemplateType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponTemplateTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponTemplateTypeReactiveObject.class index bf7644ca..a5213a6b 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponTemplateTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponTemplateTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponTemplateType__1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponTemplateType__1.class index fec5cfc7..c5dbe910 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponTemplateType__1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponTemplateType__1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponTemplateType__1ReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponTemplateType__1ReactiveObject.class index 08d54e1b..133bed8e 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponTemplateType__1ReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponTemplateType__1ReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponType.class index a53f49b4..537766f3 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponTypeReactiveObject.class index 679dc97f..3f40cac8 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CouponTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CreateOrderParams.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CreateOrderParams.class index 96709534..ad88c720 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/CreateOrderParams.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/CreateOrderParams.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeliveryInfoType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeliveryInfoType.class index 11035ed4..b66c8aae 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeliveryInfoType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeliveryInfoType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeliveryInfoTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeliveryInfoTypeReactiveObject.class index 765e4b30..d6173e0c 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeliveryInfoTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeliveryInfoTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeliveryOptionType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeliveryOptionType.class index 8d0fbdcc..22607ba6 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeliveryOptionType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeliveryOptionType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeliveryOptionTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeliveryOptionTypeReactiveObject.class index 4c678dad..09c8691d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeliveryOptionTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeliveryOptionTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeviceInfo.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeviceInfo.class index b8c456bd..165a7447 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeviceInfo.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeviceInfo.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeviceInfoReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeviceInfoReactiveObject.class index 336e2b7e..f86331db 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeviceInfoReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeviceInfoReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeviceState.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeviceState.class index 363901e9..f0675245 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeviceState.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeviceState.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeviceStateReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeviceStateReactiveObject.class index 04eb03f3..2067e4a7 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeviceStateReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/DeviceStateReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExchangeRecord.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExchangeRecord.class index 917f3946..ea4cf233 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExchangeRecord.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExchangeRecord.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExchangeRecordReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExchangeRecordReactiveObject.class index dc396799..1499e305 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExchangeRecordReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExchangeRecordReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExpiringDetail.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExpiringDetail.class index 899c8738..aeb7b7e1 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExpiringDetail.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExpiringDetail.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExpiringDetailReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExpiringDetailReactiveObject.class index d027a1ed..4abd26cd 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExpiringDetailReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExpiringDetailReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExtraInfoItem.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExtraInfoItem.class index 1769b330..1094a5f7 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExtraInfoItem.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExtraInfoItem.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExtraInfoItemReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExtraInfoItemReactiveObject.class index df9454d1..d079af85 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExtraInfoItemReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ExtraInfoItemReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/FavoriteType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/FavoriteType.class index 6721843f..d7923ee2 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/FavoriteType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/FavoriteType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/FavoriteTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/FavoriteTypeReactiveObject.class index 4ed6ae91..093b8318 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/FavoriteTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/FavoriteTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/FollowedShop.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/FollowedShop.class index 84d5e4eb..5c10741f 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/FollowedShop.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/FollowedShop.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/FollowedShopReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/FollowedShopReactiveObject.class index 7b8be5c9..18b81739 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/FollowedShopReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/FollowedShopReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/FootprintGroup.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/FootprintGroup.class index f8e7e9a6..174596e0 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/FootprintGroup.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/FootprintGroup.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/FootprintItemType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/FootprintItemType.class index 99b2969e..8b0ade16 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/FootprintItemType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/FootprintItemType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/FootprintSaveType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/FootprintSaveType.class index f3be4a82..82395fdd 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/FootprintSaveType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/FootprintSaveType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/FootprintType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/FootprintType.class index a6098fae..c5314afe 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/FootprintType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/FootprintType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/FootprintTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/FootprintTypeReactiveObject.class index 83e49808..5c25e137 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/FootprintTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/FootprintTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenApp$Companion.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenApp$Companion.class index 5d0600c4..4fa2a462 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenApp$Companion.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenApp$Companion.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenApp.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenApp.class index da268f7f..1dc86a5b 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenApp.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenApp.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$addToCart$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$addToCart$1$1.class index 3645de71..624c4962 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$addToCart$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$addToCart$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$decreaseQuantity$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$decreaseQuantity$1$1.class index b1ec4fd1..3e32f058 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$decreaseQuantity$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$decreaseQuantity$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$deleteSelectedItems$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$deleteSelectedItems$1$1.class index efbf6dba..ceeb295f 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$deleteSelectedItems$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$deleteSelectedItems$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$goToCheckout$1$selectedItems$2$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$goToCheckout$1$selectedItems$2$1.class index d5f18bc8..cb1167ba 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$goToCheckout$1$selectedItems$2$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$goToCheckout$1$selectedItems$2$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$increaseQuantity$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$increaseQuantity$1$1.class index bae8a881..de18e3bd 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$increaseQuantity$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$increaseQuantity$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$loadCartData$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$loadCartData$1$1.class index efef060f..469750ef 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$loadCartData$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$loadCartData$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$refreshRecommend$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$refreshRecommend$1$1.class index 9333c5f4..84f7db1a 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$refreshRecommend$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$refreshRecommend$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$toggleSelect$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$toggleSelect$1$1.class index 00e07f37..cae2ef88 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$toggleSelect$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$toggleSelect$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$toggleSelectAll$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$toggleSelectAll$1$1.class index 99317fd0..e932adbe 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$toggleSelectAll$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$toggleSelectAll$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$toggleShopSelect$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$toggleShopSelect$1$1.class index 96d72ae1..797d901d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$toggleShopSelect$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion$setup$1$toggleShopSelect$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion.class index 6e5c2f93..0e5543e2 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart$Companion.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart.class index d74e9945..d9ea11b7 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCart.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_addToCart_fn$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_addToCart_fn$1.class index 6aa14800..3ed86259 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_addToCart_fn$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_addToCart_fn$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_loadCategories_fn$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_loadCategories_fn$1.class index 332a169b..9d85e35d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_loadCategories_fn$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_loadCategories_fn$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_loadProducts_fn$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_loadProducts_fn$1$1.class index 976b079a..88fb361f 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_loadProducts_fn$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_loadProducts_fn$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_loadProducts_fn$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_loadProducts_fn$1.class index c25b7627..cb50a885 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_loadProducts_fn$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_loadProducts_fn$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_loadSubCategories_fn$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_loadSubCategories_fn$1.class index 7483527a..a492fb26 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_loadSubCategories_fn$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_loadSubCategories_fn$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_selectPrimaryCategory_fn$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_selectPrimaryCategory_fn$1.class index 121fd188..d39029fc 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_selectPrimaryCategory_fn$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_selectPrimaryCategory_fn$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_selectSubCategory_fn$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_selectSubCategory_fn$1.class index a67509c3..fde58a55 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_selectSubCategory_fn$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion$setup$1$gen_selectSubCategory_fn$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion.class index 425aa1c7..c3b0fd66 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory$Companion.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory.class index ab0673d2..5bff1744 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainCategory.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$addToCart$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$addToCart$1$1.class index 4c50238f..f9e91005 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$addToCart$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$addToCart$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$doLoadHotProducts$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$doLoadHotProducts$1$1.class index 927a1ca8..95120cda 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$doLoadHotProducts$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$doLoadHotProducts$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$doLoadRecommendedProducts$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$doLoadRecommendedProducts$1$1.class index 87a82a29..bf77e0e4 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$doLoadRecommendedProducts$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$doLoadRecommendedProducts$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$initData$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$initData$1$1.class index d40fc735..978eb8e6 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$initData$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$initData$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadBrands$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadBrands$1$1.class index f390f8d2..4b1f2f9d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadBrands$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadBrands$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadCategories$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadCategories$1$1.class index 84293b84..3df4f7bf 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadCategories$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadCategories$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadHotKeywords$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadHotKeywords$1$1.class index 56557571..2e863576 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadHotKeywords$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadHotKeywords$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadHotProducts$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadHotProducts$1.class index 1da6be4f..96d8adfc 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadHotProducts$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadHotProducts$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadMore$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadMore$1$1.class index aca5a5cc..447b778a 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadMore$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadMore$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadRecommendedProducts$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadRecommendedProducts$1.class index 78c7f11a..3cc00365 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadRecommendedProducts$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadRecommendedProducts$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadSubCategories$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadSubCategories$1$1.class index 7329827c..028af154 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadSubCategories$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$loadSubCategories$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$onParentCategoryClick$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$onParentCategoryClick$1$1.class index 77443fd4..f9ad7016 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$onParentCategoryClick$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$onParentCategoryClick$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$onRefresh$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$onRefresh$1$1.class index c6ba10c9..5da31647 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$onRefresh$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion$setup$1$onRefresh$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion.class index 0f5aa8dc..9762515e 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex$Companion.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex.class index 4edcaa4a..9217b1cf 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainIndex.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainMessages$Companion$setup$1$claimCoupon$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainMessages$Companion$setup$1$claimCoupon$1$1.class index d5213305..3405ab5d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainMessages$Companion$setup$1$claimCoupon$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainMessages$Companion$setup$1$claimCoupon$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainMessages$Companion$setup$1$loadMessages$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainMessages$Companion$setup$1$loadMessages$1$1.class index bfd84126..ab298358 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainMessages$Companion$setup$1$loadMessages$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainMessages$Companion$setup$1$loadMessages$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainMessages$Companion.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainMessages$Companion.class index 989f8c17..42c5005e 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainMessages$Companion.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainMessages$Companion.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainMessages.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainMessages.class index dbaa01db..c5037c17 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainMessages.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainMessages.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainProfile$Companion.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainProfile$Companion.class index 8babeba2..3cae11d4 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainProfile$Companion.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainProfile$Companion.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainProfile$gen_loadUserProfile_fn$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainProfile$gen_loadUserProfile_fn$1.class index 7c0314db..240d1dfd 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainProfile$gen_loadUserProfile_fn$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainProfile$gen_loadUserProfile_fn$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainProfile.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainProfile.class index 9eaaaebe..be1234ce 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainProfile.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMainProfile.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressEdit$Companion$setup$1$loadAddress$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressEdit$Companion$setup$1$loadAddress$1$1.class index c290e34a..e3e9892c 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressEdit$Companion$setup$1$loadAddress$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressEdit$Companion$setup$1$loadAddress$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressEdit$Companion$setup$1$saveAddress$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressEdit$Companion$setup$1$saveAddress$1$1.class index b4e767b4..201a014c 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressEdit$Companion$setup$1$saveAddress$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressEdit$Companion$setup$1$saveAddress$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressEdit$Companion.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressEdit$Companion.class index 21fb6067..599ddc23 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressEdit$Companion.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressEdit$Companion.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressEdit.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressEdit.class index 7a26c627..e26acbdd 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressEdit.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressEdit.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressList$Companion$setup$1$selectAddress$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressList$Companion$setup$1$selectAddress$1$1.class index cddb324a..92b4db1d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressList$Companion$setup$1$selectAddress$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressList$Companion$setup$1$selectAddress$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressList$Companion.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressList$Companion.class index f6790aea..f0a09719 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressList$Companion.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressList$Companion.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressList.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressList.class index dcf6b222..74e1e009 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressList.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerAddressList.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerApplyRefund$Companion$setup$1$loadOrderInfo$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerApplyRefund$Companion$setup$1$loadOrderInfo$1$1.class index 96082908..e6ff33dc 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerApplyRefund$Companion$setup$1$loadOrderInfo$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerApplyRefund$Companion$setup$1$loadOrderInfo$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerApplyRefund$Companion$setup$1$submitRefund$1$1$result$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerApplyRefund$Companion$setup$1$submitRefund$1$1$result$1.class index 564b65d2..b54a6173 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerApplyRefund$Companion$setup$1$submitRefund$1$1$result$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerApplyRefund$Companion$setup$1$submitRefund$1$1$result$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerApplyRefund$Companion$setup$1$submitRefund$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerApplyRefund$Companion$setup$1$submitRefund$1$1.class index f2c1264c..4cf5b32d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerApplyRefund$Companion$setup$1$submitRefund$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerApplyRefund$Companion$setup$1$submitRefund$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerApplyRefund$Companion.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerApplyRefund$Companion.class index 5643d061..6cb05e6a 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerApplyRefund$Companion.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerApplyRefund$Companion.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerApplyRefund.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerApplyRefund.class index f2a99f2d..de82a177 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerApplyRefund.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerApplyRefund.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$gen_loadAddressList_fn$1$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$gen_loadAddressList_fn$1$1$1.class index e20a2514..4e6334ee 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$gen_loadAddressList_fn$1$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$gen_loadAddressList_fn$1$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$gen_loadDefaultAddress_fn$1$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$gen_loadDefaultAddress_fn$1$1$1.class index b03a07d1..ac0a1596 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$gen_loadDefaultAddress_fn$1$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$gen_loadDefaultAddress_fn$1$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$handleSaveConfirm$1$1$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$handleSaveConfirm$1$1$1$1.class index 7f97aefe..4738c685 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$handleSaveConfirm$1$1$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$handleSaveConfirm$1$1$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$processCheckoutItems$1$1$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$processCheckoutItems$1$1$1$1.class index 6ccf4d4f..23fe2482 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$processCheckoutItems$1$1$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$processCheckoutItems$1$1$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$submitOrder$1$1$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$submitOrder$1$1$1$1.class index f93a9ded..4cf0037d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$submitOrder$1$1$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$submitOrder$1$1$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$submitOrder$1$1$1$2$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$submitOrder$1$1$1$2$1.class index 9284afac..e249a517 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$submitOrder$1$1$1$2$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion$setup$1$submitOrder$1$1$1$2$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion.class index 0d688d84..0def8009 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout$Companion.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout.class index 1ab411bd..39838e5d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerCheckout.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerLogistics$Companion$setup$1$loadLogisticsInfo$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerLogistics$Companion$setup$1$loadLogisticsInfo$1$1.class index fb44063e..e4fa36d6 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerLogistics$Companion$setup$1$loadLogisticsInfo$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerLogistics$Companion$setup$1$loadLogisticsInfo$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerLogistics$Companion.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerLogistics$Companion.class index d081eb96..ce672c65 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerLogistics$Companion.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerLogistics$Companion.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerLogistics.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerLogistics.class index a2b9eefb..8771aebe 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerLogistics.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerLogistics.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$doApplyRefund$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$doApplyRefund$1$1.class index cf38ec77..3f2fb151 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$doApplyRefund$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$doApplyRefund$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$doCancelOrder$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$doCancelOrder$1$1.class index e89d2439..70644bcd 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$doCancelOrder$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$doCancelOrder$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$doConfirmReceive$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$doConfirmReceive$1$1.class index c0f2796b..ac54f569 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$doConfirmReceive$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$doConfirmReceive$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$formatSpecs$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$formatSpecs$1.class index 2e0c063b..0095c4bf 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$formatSpecs$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$formatSpecs$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$loadOrderDetail$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$loadOrderDetail$1$1.class index d243e4e8..43da407d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$loadOrderDetail$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$loadOrderDetail$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$loadShopInfo$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$loadShopInfo$1$1.class index 7a6bc903..e5834fc6 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$loadShopInfo$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$loadShopInfo$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$rePurchase$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$rePurchase$1$1.class index cd3d6592..27497c0c 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$rePurchase$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$rePurchase$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$remindDelivery$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$remindDelivery$1$1.class index 8320a40e..1f164300 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$remindDelivery$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$remindDelivery$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$shareForFree$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$shareForFree$1$1.class index d53613d0..8ca4b9a0 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$shareForFree$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion$setup$1$shareForFree$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion.class index 8292b181..8825ded4 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail$Companion.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail.class index cb9ee991..fd76b428 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrderDetail.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrders$Companion.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrders$Companion.class index a37b9f05..9a91a30a 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrders$Companion.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrders$Companion.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrders.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrders.class index cd57e72e..644612d7 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrders.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerOrders.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerReview$Companion$setup$1$loadOrderData$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerReview$Companion$setup$1$loadOrderData$1$1.class index e4763c53..dc360443 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerReview$Companion$setup$1$loadOrderData$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerReview$Companion$setup$1$loadOrderData$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerReview$Companion$setup$1$submitReview$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerReview$Companion$setup$1$submitReview$1$1.class index 8157ae06..a87cd3d8 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerReview$Companion$setup$1$submitReview$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerReview$Companion$setup$1$submitReview$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerReview$Companion$setup$1$uploadImage$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerReview$Companion$setup$1$uploadImage$1$1.class index c6510bd0..3fda85ec 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerReview$Companion$setup$1$uploadImage$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerReview$Companion$setup$1$uploadImage$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerReview$Companion.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerReview$Companion.class index 0398dbda..c1443e3a 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerReview$Companion.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerReview$Companion.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerReview.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerReview.class index bee730f5..bbbf1a29 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerReview.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerReview.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet$Companion$setup$1$confirmRecharge$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet$Companion$setup$1$confirmRecharge$1$1.class index 222317fb..c0b292e1 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet$Companion$setup$1$confirmRecharge$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet$Companion$setup$1$confirmRecharge$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet$Companion$setup$1$loadBalance$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet$Companion$setup$1$loadBalance$1$1.class index f9aefb09..57404b09 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet$Companion$setup$1$loadBalance$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet$Companion$setup$1$loadBalance$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet$Companion$setup$1$loadTransactions$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet$Companion$setup$1$loadTransactions$1$1.class index ee6859a6..f7dd6c2e 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet$Companion$setup$1$loadTransactions$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet$Companion$setup$1$loadTransactions$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet$Companion$setup$1$loadWalletData$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet$Companion$setup$1$loadWalletData$1$1.class index c4de38df..7f076b4e 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet$Companion$setup$1$loadWalletData$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet$Companion$setup$1$loadWalletData$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet$Companion.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet$Companion.class index 57ecee0a..b78f0957 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet$Companion.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet$Companion.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet.class index c8df6299..b67be049 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenPagesMallConsumerWallet.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenUniApp.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenUniApp.class index 2e077067..a60f8779 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenUniApp.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GenUniApp.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GuessItemType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GuessItemType.class index b6319feb..bd9bfcf3 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GuessItemType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GuessItemType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GuessItemTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GuessItemTypeReactiveObject.class index 6210ff43..d9a015a5 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/GuessItemTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/GuessItemTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/HotSearchItemType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/HotSearchItemType.class index fb60f108..504d10bc 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/HotSearchItemType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/HotSearchItemType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/HotSearchItemTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/HotSearchItemTypeReactiveObject.class index 1a140061..f9eefecc 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/HotSearchItemTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/HotSearchItemTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/I18nGlobal.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/I18nGlobal.class index 9677a8bc..bb842c47 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/I18nGlobal.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/I18nGlobal.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/I18nInstance.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/I18nInstance.class index 6bace7fe..61efe943 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/I18nInstance.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/I18nInstance.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$ADDRESS_LABEL$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$ADDRESS_LABEL$1.class index a4930bfc..bd08a010 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$ADDRESS_LABEL$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$ADDRESS_LABEL$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$COUPON_TYPE$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$COUPON_TYPE$1.class index e96456ec..6a07885e 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$COUPON_TYPE$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$COUPON_TYPE$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$DELIVERY_STATUS$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$DELIVERY_STATUS$1.class index 08e26beb..2c0c0d47 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$DELIVERY_STATUS$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$DELIVERY_STATUS$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$FAVORITE_TYPE$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$FAVORITE_TYPE$1.class index 5d368079..6ff0f895 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$FAVORITE_TYPE$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$FAVORITE_TYPE$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$MALL_USER_TYPE$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$MALL_USER_TYPE$1.class index fbeb579f..6c6a6809 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$MALL_USER_TYPE$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$MALL_USER_TYPE$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$ORDER_STATUS$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$ORDER_STATUS$1.class index 76a1af22..2fb70f10 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$ORDER_STATUS$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$ORDER_STATUS$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$PAYMENT_METHOD$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$PAYMENT_METHOD$1.class index 3a712d34..acc33150 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$PAYMENT_METHOD$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$PAYMENT_METHOD$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$SUBSCRIPTION_PERIOD$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$SUBSCRIPTION_PERIOD$1.class index 90e4a4b9..4aa06f7f 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$SUBSCRIPTION_PERIOD$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$SUBSCRIPTION_PERIOD$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$SUBSCRIPTION_STATUS$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$SUBSCRIPTION_STATUS$1.class index a33baa8d..a6828da1 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$SUBSCRIPTION_STATUS$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$SUBSCRIPTION_STATUS$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$VERIFICATION_STATUS$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$VERIFICATION_STATUS$1.class index 2ddf1e29..f72905a2 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$VERIFICATION_STATUS$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$VERIFICATION_STATUS$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$ensureUserProfile$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$ensureUserProfile$1$1.class index c23eb405..394c531c 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$ensureUserProfile$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$ensureUserProfile$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$ensureUserProfile$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$ensureUserProfile$1.class index 9026c763..b1a41309 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$ensureUserProfile$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt$ensureUserProfile$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt.class index 11f0f7b2..32093eea 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/IndexKt.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/LevelLog.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/LevelLog.class index 03d34257..2ee09e7b 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/LevelLog.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/LevelLog.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/LevelLogReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/LevelLogReactiveObject.class index 0ce1ab2a..a6e676d2 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/LevelLogReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/LevelLogReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/LocalCartItem.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/LocalCartItem.class index 6c7d16de..572b296f 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/LocalCartItem.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/LocalCartItem.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/LocalCartItemReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/LocalCartItemReactiveObject.class index c9185b15..b369eb6a 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/LocalCartItemReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/LocalCartItemReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/LocalCategory.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/LocalCategory.class index d2218b1c..07350d16 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/LocalCategory.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/LocalCategory.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/LocalCategoryReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/LocalCategoryReactiveObject.class index 3dbe6c30..a73dd77d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/LocalCategoryReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/LocalCategoryReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/LocaleWrapper.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/LocaleWrapper.class index 9da1f152..c3125629 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/LocaleWrapper.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/LocaleWrapper.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MemberInfo.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MemberInfo.class index 644aab13..8850838b 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MemberInfo.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MemberInfo.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MemberInfoReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MemberInfoReactiveObject.class index c481c7ef..68aeb168 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MemberInfoReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MemberInfoReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MemberLevel.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MemberLevel.class index d58044e6..ce386daa 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MemberLevel.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MemberLevel.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MemberLevelReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MemberLevelReactiveObject.class index 9974bdfb..ba3919ac 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MemberLevelReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MemberLevelReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantRatingType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantRatingType.class index 2be75a96..22de085c 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantRatingType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantRatingType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantRatingTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantRatingTypeReactiveObject.class index d8df9ad6..64a2e6f8 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantRatingTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantRatingTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantType.class index 957430bc..474f84b8 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantTypeReactiveObject.class index 452cca49..94bdf11e 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantType__1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantType__1.class index a776899a..b228663b 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantType__1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantType__1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantType__1ReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantType__1ReactiveObject.class index b892a682..f6d1f3a7 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantType__1ReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MerchantType__1ReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageItem.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageItem.class index a8169815..12739da5 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageItem.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageItem.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageItemReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageItemReactiveObject.class index cfdb6257..42ba82f3 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageItemReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageItemReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageTab.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageTab.class index 11032367..c7cbeeb2 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageTab.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageTab.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageTabReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageTabReactiveObject.class index f93b3b47..c287c255 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageTabReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageTabReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageType.class index 16b3a2f4..92654fdf 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageTypeReactiveObject.class index eaa8ebd3..482c094c 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MessageTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MockAddress.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MockAddress.class index 454d993a..2ee518ee 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MockAddress.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MockAddress.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MyReviewItem.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MyReviewItem.class index 0c973424..a90e20e5 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MyReviewItem.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MyReviewItem.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MyReviewItemReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MyReviewItemReactiveObject.class index 9782d0a0..b69705a1 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/MyReviewItemReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/MyReviewItemReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/NewAddressData.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/NewAddressData.class index f3f7dff8..4d2f9028 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/NewAddressData.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/NewAddressData.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/NewAddressForm.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/NewAddressForm.class index a82a3978..921eb2ed 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/NewAddressForm.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/NewAddressForm.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/NewAddressFormReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/NewAddressFormReactiveObject.class index 289fc415..e1500ab3 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/NewAddressFormReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/NewAddressFormReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/Notification.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/Notification.class index f277bb71..cf405d24 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/Notification.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/Notification.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/NotificationType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/NotificationType.class index 2499f709..6f08c79d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/NotificationType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/NotificationType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/NotificationTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/NotificationTypeReactiveObject.class index 709eac9c..00376cd6 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/NotificationTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/NotificationTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderCountsType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderCountsType.class index c7e9abd5..17bd51c7 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderCountsType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderCountsType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderCountsTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderCountsTypeReactiveObject.class index ccc8ce99..cc27c3a1 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderCountsTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderCountsTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItem.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItem.class index cad5c4af..a6b08606 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItem.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItem.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemReactiveObject.class index 48be1060..25767e43 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemType.class index 913d8bb0..319e7b74 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemTypeReactiveObject.class index db296b6c..393f19f3 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemType__1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemType__1.class index 699bbea5..ae4f9db1 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemType__1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemType__1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemType__1ReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemType__1ReactiveObject.class index 6923d7f5..fa1ab996 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemType__1ReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemType__1ReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemType__2.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemType__2.class index 2408f913..28746aee 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemType__2.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemType__2.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemType__2ReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemType__2ReactiveObject.class index da212cae..5be76adc 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemType__2ReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderItemType__2ReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderOptions.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderOptions.class index ab86ace7..9c35e68d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderOptions.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderOptions.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderProduct.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderProduct.class index 5a9c9a66..05f9a402 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderProduct.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderProduct.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderProductReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderProductReactiveObject.class index 1cdb309e..dc5cfb4d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderProductReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderProductReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderTabItem.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderTabItem.class index 2140bbb8..b9234ced 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderTabItem.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderTabItem.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderTabItemReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderTabItemReactiveObject.class index 37c6f2fa..447fc1c1 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderTabItemReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderTabItemReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderType.class index 302a1598..d26853b3 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderTypeReactiveObject.class index 5b36dd67..896320a2 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderType__1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderType__1.class index bf8e0975..963fade1 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderType__1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderType__1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderType__1ReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderType__1ReactiveObject.class index b54631b3..c43bfaff 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderType__1ReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/OrderType__1ReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/PaginatedResponse.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/PaginatedResponse.class index 218602af..85a57bd6 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/PaginatedResponse.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/PaginatedResponse.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/PaymentMethodType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/PaymentMethodType.class index b84cee24..93610e11 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/PaymentMethodType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/PaymentMethodType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/PaymentMethodTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/PaymentMethodTypeReactiveObject.class index 9021872c..d4e3f388 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/PaymentMethodTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/PaymentMethodTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/PendingItem.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/PendingItem.class index 24ffea6d..7ab1e7c2 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/PendingItem.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/PendingItem.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/PendingItemReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/PendingItemReactiveObject.class index 85e65024..6bafb685 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/PendingItemReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/PendingItemReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/PointProduct.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/PointProduct.class index 5f153fe9..98d4dee2 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/PointProduct.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/PointProduct.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/PointProductReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/PointProductReactiveObject.class index a3ac8ab7..77d6d4bf 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/PointProductReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/PointProductReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/PointRecord.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/PointRecord.class index 9be20946..3cf1749d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/PointRecord.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/PointRecord.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/PointRecordReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/PointRecordReactiveObject.class index 675e7396..96568470 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/PointRecordReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/PointRecordReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/PrivacyType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/PrivacyType.class index cbb5bbcd..eac8d9f6 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/PrivacyType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/PrivacyType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/PrivacyTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/PrivacyTypeReactiveObject.class index dd776b80..c876f1f2 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/PrivacyTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/PrivacyTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/Product.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/Product.class index a4c1d14f..1630e840 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/Product.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/Product.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductReactiveObject.class index 0c3fde5f..61d6643f 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductSku.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductSku.class index f0c115be..27bfaee7 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductSku.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductSku.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductSkuType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductSkuType.class index dfa27e7f..4318219b 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductSkuType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductSkuType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductSkuTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductSkuTypeReactiveObject.class index ded349ec..60b7b4a5 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductSkuTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductSkuTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductType.class index 4b99d6b1..199d48f5 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductTypeReactiveObject.class index 3bf07935..e14ecba4 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProductTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProfileType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProfileType.class index 8f6090df..dc872f64 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProfileType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProfileType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProfileTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProfileTypeReactiveObject.class index 55c6efec..7228d607 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProfileTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ProfileTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RecommendProduct.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RecommendProduct.class index 6d48ae47..033dd8cd 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RecommendProduct.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RecommendProduct.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RecommendProductReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RecommendProductReactiveObject.class index 7c53f2f5..8b8171a4 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RecommendProductReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RecommendProductReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RedPacket.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RedPacket.class index d872402b..a1990397 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RedPacket.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RedPacket.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RedPacketReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RedPacketReactiveObject.class index f01f47ba..392f9b52 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RedPacketReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RedPacketReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundOrderInfo.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundOrderInfo.class index 440cfe64..714bdd36 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundOrderInfo.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundOrderInfo.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundOrderInfoReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundOrderInfoReactiveObject.class index 0d36cf82..102e808f 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundOrderInfoReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundOrderInfoReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundOrderItem.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundOrderItem.class index 2ab4f7ce..baa366be 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundOrderItem.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundOrderItem.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundOrderItemReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundOrderItemReactiveObject.class index 8e6dc628..90e47404 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundOrderItemReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundOrderItemReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundProductInfo.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundProductInfo.class index fb881f99..172850fa 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundProductInfo.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundProductInfo.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundProductInfoReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundProductInfoReactiveObject.class index d7cc8a73..fb10df4c 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundProductInfoReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundProductInfoReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundResponse.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundResponse.class index b0462b1c..e85c7727 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundResponse.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundResponse.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundStatusHistoryItem.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundStatusHistoryItem.class index 8c92b73c..9a0a568a 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundStatusHistoryItem.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundStatusHistoryItem.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundStatusHistoryItemReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundStatusHistoryItemReactiveObject.class index 4d36562a..91193052 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundStatusHistoryItemReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundStatusHistoryItemReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundType.class index ddfab7fe..6017cedb 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundTypeReactiveObject.class index bdc7413b..b218b2b5 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/RefundTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ReviewItem.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ReviewItem.class index f5858e58..3835188b 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ReviewItem.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ReviewItem.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ReviewItemReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ReviewItemReactiveObject.class index ad6d1e6a..fbf7ca90 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ReviewItemReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ReviewItemReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SearchResultType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SearchResultType.class index 3c368910..9c02536c 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SearchResultType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SearchResultType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SearchResultTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SearchResultTypeReactiveObject.class index 5bb7ce3f..f3ed9677 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SearchResultTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SearchResultTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ServiceCountsType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ServiceCountsType.class index 4116e21e..b20e56f2 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ServiceCountsType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ServiceCountsType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ServiceCountsTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ServiceCountsTypeReactiveObject.class index 951c4462..f099998c 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ServiceCountsTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ServiceCountsTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShareRecord.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShareRecord.class index 9a25197d..e3e3a950 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShareRecord.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShareRecord.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShareRecordReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShareRecordReactiveObject.class index 894a66a9..3b96d0d3 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShareRecordReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShareRecordReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShareRecordType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShareRecordType.class index 5dd61336..e18c624f 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShareRecordType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShareRecordType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShareRecordTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShareRecordTypeReactiveObject.class index a2392110..700342ea 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShareRecordTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShareRecordTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/Shop.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/Shop.class index 9f18feee..958fad98 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/Shop.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/Shop.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShopGroupType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShopGroupType.class index e133a13a..662f5860 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShopGroupType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShopGroupType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShopOrderParams.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShopOrderParams.class index 51710dcd..afa53053 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShopOrderParams.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShopOrderParams.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShopOrderResponse.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShopOrderResponse.class index 6b3185d1..c8e7cf47 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShopOrderResponse.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShopOrderResponse.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShopResultType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShopResultType.class index ca28f073..234d90f2 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShopResultType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShopResultType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShopResultTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShopResultTypeReactiveObject.class index 89709e90..74404033 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShopResultTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/ShopResultTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SortTab.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SortTab.class index 29da2c14..9ce27f6f 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SortTab.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SortTab.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/State.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/State.class index db63b468..a2001f18 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/State.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/State.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/StateReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/StateReactiveObject.class index b7fc6d2c..1b90949d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/StateReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/StateReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsPeriodType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsPeriodType.class index 16a358c4..cbb333a9 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsPeriodType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsPeriodType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsPeriodTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsPeriodTypeReactiveObject.class index b1460080..dc8b34a2 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsPeriodTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsPeriodTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsType.class index bb98629d..67296fea 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsTypeReactiveObject.class index 5bf4ad51..43371f82 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsType__1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsType__1.class index d33e4185..9a547f3c 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsType__1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsType__1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsType__1ReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsType__1ReactiveObject.class index 373a14bd..acf332c2 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsType__1ReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/StatsType__1ReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addAddress$1$response$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addAddress$1$response$1.class index a322cf02..59d18657 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addAddress$1$response$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addAddress$1$response$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addAddress$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addAddress$1.class index ba54c043..74f1396f 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addAddress$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addAddress$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addBankCard$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addBankCard$1.class index d8cd447d..b95d99b6 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addBankCard$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addBankCard$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addFootprint$1$updateRes$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addFootprint$1$updateRes$1.class index fa299ace..72d34649 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addFootprint$1$updateRes$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addFootprint$1$updateRes$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addFootprint$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addFootprint$1.class index 643337a5..bb6681cd 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addFootprint$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addFootprint$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addPoints$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addPoints$1.class index 39f5adca..f08e3f1a 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addPoints$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addPoints$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addToCart$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addToCart$1$1.class index f81b9bee..8ed271b4 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addToCart$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addToCart$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addToCart$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addToCart$1.class index da0384e8..f620446b 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addToCart$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$addToCart$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$appendReview$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$appendReview$1.class index 643ef182..eb23f2c9 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$appendReview$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$appendReview$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$applyRefund$1$response$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$applyRefund$1$response$1.class index 08ea0f52..bb417a00 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$applyRefund$1$response$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$applyRefund$1$response$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$applyRefund$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$applyRefund$1.class index 61041304..74648560 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$applyRefund$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$applyRefund$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$batchDeleteCartItems$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$batchDeleteCartItems$1.class index 9fd52af4..18290ee5 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$batchDeleteCartItems$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$batchDeleteCartItems$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$batchUpdateCartItemSelection$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$batchUpdateCartItemSelection$1.class index 3f4c890c..cc9ac8ca 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$batchUpdateCartItemSelection$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$batchUpdateCartItemSelection$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$cancelOrder$1$response$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$cancelOrder$1$response$1.class index 1eb1db9e..17fd44fc 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$cancelOrder$1$response$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$cancelOrder$1$response$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$cancelOrder$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$cancelOrder$1.class index d70dccd0..9b546262 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$cancelOrder$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$cancelOrder$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$cancelRefund$1$orderUpdateResponse$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$cancelRefund$1$orderUpdateResponse$1.class index afd5d90b..21d50704 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$cancelRefund$1$orderUpdateResponse$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$cancelRefund$1$orderUpdateResponse$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$cancelRefund$1$refundUpdateResponse$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$cancelRefund$1$refundUpdateResponse$1.class index 2578e53e..d383805e 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$cancelRefund$1$refundUpdateResponse$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$cancelRefund$1$refundUpdateResponse$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$cancelRefund$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$cancelRefund$1.class index 16604c1c..26abff53 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$cancelRefund$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$cancelRefund$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$checkFavorite$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$checkFavorite$1.class index 40acabc7..4ead0fd7 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$checkFavorite$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$checkFavorite$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$claimCoupon$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$claimCoupon$1.class index 1d2c2a0a..7fe20481 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$claimCoupon$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$claimCoupon$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$claimShopCoupon$1$fallbackData$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$claimShopCoupon$1$fallbackData$1.class index 28b7348c..918961df 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$claimShopCoupon$1$fallbackData$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$claimShopCoupon$1$fallbackData$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$claimShopCoupon$1$insertData$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$claimShopCoupon$1$insertData$1.class index 7ea11d9f..8efe1aec 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$claimShopCoupon$1$insertData$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$claimShopCoupon$1$insertData$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$claimShopCoupon$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$claimShopCoupon$1.class index 7ff05234..1d751172 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$claimShopCoupon$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$claimShopCoupon$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$clearCart$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$clearCart$1.class index 66fcee5b..32b81faf 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$clearCart$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$clearCart$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$clearDefaultAddress$1$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$clearDefaultAddress$1$1.class index 2624be16..a88e8b2f 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$clearDefaultAddress$1$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$clearDefaultAddress$1$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$clearDefaultAddress$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$clearDefaultAddress$1.class index 97b7f087..4aa09816 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$clearDefaultAddress$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$clearDefaultAddress$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$clearFootprints$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$clearFootprints$1.class index ba04ab0a..19911adb 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$clearFootprints$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$clearFootprints$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$confirmOrderReceived$1$response$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$confirmOrderReceived$1$response$1.class index cbe34cbd..8921fbf9 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$confirmOrderReceived$1$response$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$confirmOrderReceived$1$response$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$confirmOrderReceived$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$confirmOrderReceived$1.class index c3b6bc87..a6509596 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$confirmOrderReceived$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$confirmOrderReceived$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$confirmReceipt$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$confirmReceipt$1.class index f47b483c..6c40bff9 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$confirmReceipt$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$confirmReceipt$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createOrder$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createOrder$1.class index a12d2d40..b1b782d5 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createOrder$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createOrder$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createOrdersByShop$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createOrdersByShop$1.class index bfd345b7..a7eefd10 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createOrdersByShop$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createOrdersByShop$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createRefund$1$payload$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createRefund$1$payload$1.class index 97292d5d..f7d1d7d6 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createRefund$1$payload$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createRefund$1$payload$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createRefund$1$updateResponse$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createRefund$1$updateResponse$1.class index 933ea2ae..6583c31e 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createRefund$1$updateResponse$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createRefund$1$updateResponse$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createRefund$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createRefund$1.class index 934337ab..68473bc6 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createRefund$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createRefund$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createShareRecord$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createShareRecord$1.class index 1e9299ea..9cd08271 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createShareRecord$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$createShareRecord$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deductPoints$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deductPoints$1.class index 1c788d38..ea2cbf6c 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deductPoints$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deductPoints$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteAddress$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteAddress$1.class index 37b2450c..41448d5f 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteAddress$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteAddress$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteBankCard$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteBankCard$1.class index 780a8746..7bcb302b 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteBankCard$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteBankCard$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteCartItem$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteCartItem$1.class index 70dd63f9..51c99543 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteCartItem$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteCartItem$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteFootprint$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteFootprint$1.class index 1453a271..e5ad97b5 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteFootprint$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteFootprint$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteFootprints$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteFootprints$1.class index 7a97e8b4..d36d79d1 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteFootprints$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteFootprints$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteOrder$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteOrder$1.class index 4c680b8e..9be2e5e9 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteOrder$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteOrder$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteRefund$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteRefund$1.class index 7f38d73a..e16fcd61 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteRefund$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteRefund$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteReview$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteReview$1.class index 7ed01415..3db74e5c 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteReview$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$deleteReview$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$ensureSession$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$ensureSession$1.class index 51beb8e0..9c7d95f3 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$ensureSession$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$ensureSession$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$exchangeProduct$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$exchangeProduct$1.class index 8c8a6bf1..55fc6380 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$exchangeProduct$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$exchangeProduct$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$fetchShopCoupons$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$fetchShopCoupons$1.class index 296f1e03..e744bd73 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$fetchShopCoupons$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$fetchShopCoupons$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$followShop$1$res$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$followShop$1$res$1.class index ad0fd24b..fd1638b4 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$followShop$1$res$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$followShop$1$res$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$followShop$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$followShop$1.class index 59af5490..f7a46e12 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$followShop$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$followShop$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getAddressById$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getAddressById$1.class index 84494c06..7aac817a 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getAddressById$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getAddressById$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getAddressList$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getAddressList$1.class index 848d5d89..c9c69310 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getAddressList$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getAddressList$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getAddresses$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getAddresses$1.class index 6f914473..ac90997b 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getAddresses$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getAddresses$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getAvailableCoupons$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getAvailableCoupons$1.class index 208df785..0beeab01 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getAvailableCoupons$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getAvailableCoupons$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getBalanceRecords$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getBalanceRecords$1.class index d56e02a4..6d09537a 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getBalanceRecords$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getBalanceRecords$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getBrands$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getBrands$1.class index 9af94e33..90db2149 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getBrands$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getBrands$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getCartItems$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getCartItems$1.class index 9b9f593d..68bcfb41 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getCartItems$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getCartItems$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getCategories$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getCategories$1.class index 3f224f20..66a45340 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getCategories$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getCategories$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getCategoryById$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getCategoryById$1.class index 040523bc..99a7a40e 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getCategoryById$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getCategoryById$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getChatMessages$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getChatMessages$1.class index 467afd4e..1caff2a4 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getChatMessages$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getChatMessages$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getChatRooms$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getChatRooms$1.class index 05e12769..a1f761aa 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getChatRooms$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getChatRooms$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getDiscountProducts$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getDiscountProducts$1.class index f25026a0..7aaa42b2 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getDiscountProducts$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getDiscountProducts$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getExchangeRecords$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getExchangeRecords$1.class index 2ffea131..b6079f88 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getExchangeRecords$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getExchangeRecords$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getExpiringPoints$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getExpiringPoints$1.class index 09d487a7..22ad06fa 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getExpiringPoints$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getExpiringPoints$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getExpiryNotifications$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getExpiryNotifications$1.class index c144e99f..f0d0af5a 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getExpiryNotifications$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getExpiryNotifications$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getFavorites$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getFavorites$1.class index 85561c7a..a8a5da86 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getFavorites$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getFavorites$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getFollowedShops$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getFollowedShops$1.class index cd060bd5..760e34f7 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getFollowedShops$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getFollowedShops$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getFootprints$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getFootprints$1.class index 4acf86cf..d432bd6c 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getFootprints$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getFootprints$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getFreeOrderRewards$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getFreeOrderRewards$1.class index 6f79b4d3..ae345e92 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getFreeOrderRewards$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getFreeOrderRewards$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getHotKeywords$1$KeywordEntry.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getHotKeywords$1$KeywordEntry.class index 14d14ca8..3788b8fa 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getHotKeywords$1$KeywordEntry.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getHotKeywords$1$KeywordEntry.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getHotKeywords$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getHotKeywords$1.class index f8285d7d..765b750d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getHotKeywords$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getHotKeywords$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getHotProducts$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getHotProducts$1.class index 2ace60cf..4f793035 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getHotProducts$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getHotProducts$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getMemberLevelLogs$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getMemberLevelLogs$1.class index db8a640b..853f33b5 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getMemberLevelLogs$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getMemberLevelLogs$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getMemberLevels$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getMemberLevels$1.class index c293dc34..edf5c259 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getMemberLevels$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getMemberLevels$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getMerchantPromotionConfig$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getMerchantPromotionConfig$1.class index 6831d45a..896cbe26 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getMerchantPromotionConfig$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getMerchantPromotionConfig$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getMyReviews$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getMyReviews$1.class index b7ec9e0f..6028d622 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getMyReviews$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getMyReviews$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getMyShareRecords$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getMyShareRecords$1.class index aa4bc63a..f57623ff 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getMyShareRecords$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getMyShareRecords$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getOrderById$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getOrderById$1.class index 463e89a9..a4f11f76 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getOrderById$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getOrderById$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getOrderDetail$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getOrderDetail$1.class index a4200e8f..3a94e5ef 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getOrderDetail$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getOrderDetail$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getOrders$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getOrders$1.class index 2438686c..539037df 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getOrders$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getOrders$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getParentCategories$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getParentCategories$1.class index 047d2d19..a5e697b4 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getParentCategories$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getParentCategories$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getPointProducts$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getPointProducts$1.class index 9f8a6ef2..7ff03a0f 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getPointProducts$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getPointProducts$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getPointRecords$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getPointRecords$1.class index 69f7afc6..6a0d7166 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getPointRecords$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getPointRecords$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getPointsOverview$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getPointsOverview$1.class index 82a5cf74..1302a82e 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getPointsOverview$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getPointsOverview$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductById$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductById$1.class index eb9256d9..dbed8fc9 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductById$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductById$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductReviews$1$query$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductReviews$1$query$1.class index 41b699f2..8d12880c 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductReviews$1$query$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductReviews$1$query$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductReviews$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductReviews$1.class index 8842bff2..8fb663c0 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductReviews$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductReviews$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductSkus$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductSkus$1.class index 77bd96e1..7e506af7 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductSkus$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductSkus$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByCategories$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByCategories$1.class index 640b1e9d..b7b76a1a 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByCategories$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByCategories$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByCategory$1$response$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByCategory$1$response$1.class index 3de24983..e81465a8 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByCategory$1$response$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByCategory$1$response$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByCategory$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByCategory$1.class index 0f6bea27..ad83beee 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByCategory$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByCategory$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByMerchantId$1$query$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByMerchantId$1$query$1.class index eb6e2e20..ea47c965 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByMerchantId$1$query$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByMerchantId$1$query$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByMerchantId$1$query2$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByMerchantId$1$query2$1.class index c7b7f97a..17402e70 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByMerchantId$1$query2$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByMerchantId$1$query2$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByMerchantId$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByMerchantId$1.class index 58a9b6d2..b18f8dbc 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByMerchantId$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByMerchantId$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByNewest$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByNewest$1.class index 9645de79..e7b27ca7 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByNewest$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByNewest$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByPrice$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByPrice$1.class index 27c46d6d..a8113b3d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByPrice$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByPrice$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsBySales$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsBySales$1.class index 382436e5..5f80c4a7 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsBySales$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsBySales$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByShopId$1$query$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByShopId$1$query$1.class index 0509514e..e138f1e2 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByShopId$1$query$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByShopId$1$query$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByShopId$1$query2$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByShopId$1$query2$1.class index aa2991b4..446c6508 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByShopId$1$query2$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByShopId$1$query2$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByShopId$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByShopId$1.class index d782afbe..8224e3b4 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByShopId$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getProductsByShopId$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getRecommendedProducts$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getRecommendedProducts$1.class index bcbb433a..a1aa34ab 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getRecommendedProducts$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getRecommendedProducts$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getRefunds$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getRefunds$1.class index 3d36f8a6..bbd9ea92 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getRefunds$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getRefunds$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getReviewStats$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getReviewStats$1.class index b3024195..b59202b8 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getReviewStats$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getReviewStats$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getShareDetail$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getShareDetail$1.class index 46714948..3baab389 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getShareDetail$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getShareDetail$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getShopByMerchantId$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getShopByMerchantId$1.class index 202aa1ba..02c410f2 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getShopByMerchantId$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getShopByMerchantId$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getSigninRecords$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getSigninRecords$1.class index a6cf7350..dc8f1743 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getSigninRecords$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getSigninRecords$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getSmartRecommendations$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getSmartRecommendations$1.class index d2ff5f7f..f325dfbb 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getSmartRecommendations$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getSmartRecommendations$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getSubCategories$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getSubCategories$1.class index 477febd4..7a4f5198 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getSubCategories$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getSubCategories$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getTodaySigninStatus$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getTodaySigninStatus$1.class index a14d742a..0f26d349 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getTodaySigninStatus$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getTodaySigninStatus$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getTotalEarned$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getTotalEarned$1.class index 8b46eeb2..5b126c46 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getTotalEarned$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getTotalEarned$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getTransactions$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getTransactions$1.class index 151d5d8c..b7885938 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getTransactions$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getTransactions$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserBalance$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserBalance$1.class index 8cadfa62..9b7fbda1 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserBalance$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserBalance$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserBalanceNumber$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserBalanceNumber$1.class index 87c26dba..24d637c5 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserBalanceNumber$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserBalanceNumber$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserBankCards$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserBankCards$1.class index bc4d63cc..e0a6c8ac 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserBankCards$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserBankCards$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserBrowseCategories$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserBrowseCategories$1.class index 97247be2..3f7abcea 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserBrowseCategories$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserBrowseCategories$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserChatMessages$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserChatMessages$1.class index 7df2e4c9..8af0a21e 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserChatMessages$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserChatMessages$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserCouponCount$1$response$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserCouponCount$1$response$1.class index 9b8415bf..6ffddc98 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserCouponCount$1$response$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserCouponCount$1$response$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserCouponCount$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserCouponCount$1.class index 93e982f1..d176ca67 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserCouponCount$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserCouponCount$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserCoupons$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserCoupons$1.class index 2dfe4a65..02f5c9ef 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserCoupons$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserCoupons$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserMemberInfo$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserMemberInfo$1.class index c70c0a13..b50b805d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserMemberInfo$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserMemberInfo$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserNotifications$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserNotifications$1.class index eb88371d..ef06920a 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserNotifications$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserNotifications$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserPoints$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserPoints$1.class index fa3f4a82..baddd4ad 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserPoints$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserPoints$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserProfile$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserProfile$1.class index 61165da4..1b6fc9fe 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserProfile$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserProfile$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserRedPackets$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserRedPackets$1.class index 36231b1f..b1092cc3 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserRedPackets$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserRedPackets$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserSearchHistory$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserSearchHistory$1.class index a5351d77..5959e002 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserSearchHistory$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$getUserSearchHistory$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$isShareFreeEnabled$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$isShareFreeEnabled$1.class index ce88ba7a..80c2f8e3 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$isShareFreeEnabled$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$isShareFreeEnabled$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$isShopFollowed$1$res$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$isShopFollowed$1$res$1.class index 0c8bf510..c451c04a 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$isShopFollowed$1$res$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$isShopFollowed$1$res$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$isShopFollowed$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$isShopFollowed$1.class index 29b5a7d0..6643306a 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$isShopFollowed$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$isShopFollowed$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$markNotificationRead$1$res$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$markNotificationRead$1$res$1.class index 23562bc4..e3405008 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$markNotificationRead$1$res$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$markNotificationRead$1$res$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$markNotificationRead$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$markNotificationRead$1.class index b775c4b1..09a466fd 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$markNotificationRead$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$markNotificationRead$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$markRead$1$response$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$markRead$1$response$1.class index 53eafa2e..15ee67ef 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$markRead$1$response$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$markRead$1$response$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$markRead$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$markRead$1.class index 1a38a0a2..8bb9ee13 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$markRead$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$markRead$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$payOrder$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$payOrder$1.class index f3ec9ea2..7029da71 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$payOrder$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$payOrder$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$rePurchase$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$rePurchase$1.class index 5f371d87..8b9ccd91 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$rePurchase$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$rePurchase$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$rechargeBalance$1$res$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$rechargeBalance$1$res$1.class index f4df412d..54abf7bf 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$rechargeBalance$1$res$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$rechargeBalance$1$res$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$rechargeBalance$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$rechargeBalance$1.class index 35d78407..4bd2979b 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$rechargeBalance$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$rechargeBalance$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$recordBrowse$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$recordBrowse$1.class index c8a0bf07..3095dd13 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$recordBrowse$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$recordBrowse$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$recordSearch$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$recordSearch$1.class index 842dd4b6..a7adde11 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$recordSearch$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$recordSearch$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$searchProducts$1$query$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$searchProducts$1$query$1.class index ac8de744..4977d733 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$searchProducts$1$query$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$searchProducts$1$query$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$searchProducts$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$searchProducts$1.class index efe0d9cc..2bf4fa24 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$searchProducts$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$searchProducts$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$searchProductsByKeywords$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$searchProductsByKeywords$1.class index 88417630..7cb927f5 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$searchProductsByKeywords$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$searchProductsByKeywords$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$searchShops$1$response$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$searchShops$1$response$1.class index 2715bd31..ee38220e 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$searchShops$1$response$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$searchShops$1$response$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$searchShops$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$searchShops$1.class index 7468dd16..a481c747 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$searchShops$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$searchShops$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$sendChatMessage$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$sendChatMessage$1.class index efcf21c5..b425c098 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$sendChatMessage$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$sendChatMessage$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$sendMessage$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$sendMessage$1.class index cd7e5c89..f9c0002b 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$sendMessage$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$sendMessage$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$setDefaultAddress$1$response$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$setDefaultAddress$1$response$1.class index a846262a..cee8189a 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$setDefaultAddress$1$response$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$setDefaultAddress$1$response$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$setDefaultAddress$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$setDefaultAddress$1.class index 3d7c523a..e99f88d8 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$setDefaultAddress$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$setDefaultAddress$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$signin$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$signin$1.class index 7698a44f..d14ff4e1 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$signin$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$signin$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$simulateServiceReply$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$simulateServiceReply$1.class index 43bea191..1621152e 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$simulateServiceReply$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$simulateServiceReply$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$submitProductReviews$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$submitProductReviews$1.class index f0be6c7b..16927c43 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$submitProductReviews$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$submitProductReviews$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$submitShopReview$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$submitShopReview$1.class index b37e5f9c..79c26253 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$submitShopReview$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$submitShopReview$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$toggleFavorite$1$response$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$toggleFavorite$1$response$1.class index 7674776f..fd7d8956 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$toggleFavorite$1$response$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$toggleFavorite$1$response$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$toggleFavorite$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$toggleFavorite$1.class index 197bbe0b..fdcb99a2 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$toggleFavorite$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$toggleFavorite$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$toggleReviewLike$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$toggleReviewLike$1.class index c7aff9f1..127281e5 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$toggleReviewLike$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$toggleReviewLike$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$triggerPointsMaintenance$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$triggerPointsMaintenance$1.class index 30a031b3..8f1965ea 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$triggerPointsMaintenance$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$triggerPointsMaintenance$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$unfollowShop$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$unfollowShop$1.class index b122e40a..94f1e2b5 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$unfollowShop$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$unfollowShop$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$updateAddress$1$updateData$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$updateAddress$1$updateData$1.class index c9d84717..e28e3367 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$updateAddress$1$updateData$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$updateAddress$1$updateData$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$updateAddress$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$updateAddress$1.class index dd4de699..08de2fe6 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$updateAddress$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$updateAddress$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$updateCartItemQuantity$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$updateCartItemQuantity$1.class index 54ef6d93..f139c3ab 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$updateCartItemQuantity$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$updateCartItemQuantity$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$updateCartItemSelection$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$updateCartItemSelection$1.class index a8ad98c5..fea34848 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$updateCartItemSelection$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$updateCartItemSelection$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$updateOrderStatus$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$updateOrderStatus$1.class index 0169b3aa..17a9f2b2 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$updateOrderStatus$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$updateOrderStatus$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$uploadChatImage$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$uploadChatImage$1.class index 9c2490ad..5f6a4870 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$uploadChatImage$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$uploadChatImage$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$validateShareCode$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$validateShareCode$1.class index cc5fbd38..7169a06d 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$validateShareCode$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$validateShareCode$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$withdrawBalance$1$res$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$withdrawBalance$1$res$1.class index 6a93d71e..e5ae2175 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$withdrawBalance$1$res$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$withdrawBalance$1$res$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$withdrawBalance$1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$withdrawBalance$1.class index 1a105e55..c42df9a6 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$withdrawBalance$1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService$withdrawBalance$1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService.class index 4ae0e6b9..ffb268e2 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/SupabaseService.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/TabCountsType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/TabCountsType.class index 79e2388f..334d02cf 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/TabCountsType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/TabCountsType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/TabCountsTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/TabCountsTypeReactiveObject.class index 5e72fb83..03eb3fec 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/TabCountsTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/TabCountsTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/TimelineStepType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/TimelineStepType.class index 0b59dc22..14ea2c66 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/TimelineStepType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/TimelineStepType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/TrackItem.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/TrackItem.class index 34c12b17..dd70855f 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/TrackItem.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/TrackItem.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/TrackItemReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/TrackItemReactiveObject.class index 58fbc826..cfa37532 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/TrackItemReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/TrackItemReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/TransactionType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/TransactionType.class index bd1c5b2a..4d6bf5ef 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/TransactionType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/TransactionType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/TransactionTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/TransactionTypeReactiveObject.class index 1138a5ad..de30b88c 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/TransactionTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/TransactionTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UiChatMessage.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UiChatMessage.class index bb5a0e6b..5f6f3d57 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UiChatMessage.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UiChatMessage.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UiChatMessageReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UiChatMessageReactiveObject.class index d2821579..a2823b7e 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UiChatMessageReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UiChatMessageReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UniAppConfig.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UniAppConfig.class index 96744873..c02f45bc 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UniAppConfig.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UniAppConfig.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UpdateAddressParams.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UpdateAddressParams.class index 8e977af7..07a14acc 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UpdateAddressParams.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UpdateAddressParams.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserAddress.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserAddress.class index 8f712bc0..4ca677ba 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserAddress.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserAddress.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserCoupon.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserCoupon.class index 1fc85e76..35566912 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserCoupon.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserCoupon.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserCouponType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserCouponType.class index be7de9d0..54219239 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserCouponType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserCouponType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserCouponTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserCouponTypeReactiveObject.class index c398a615..058f96b9 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserCouponTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserCouponTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserProfile.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserProfile.class index e3f0dd2b..8dfed106 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserProfile.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserProfile.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserProfileReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserProfileReactiveObject.class index c30dbc6e..597a3cfd 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserProfileReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserProfileReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserStatsType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserStatsType.class index e9fb254a..ca8c1be2 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserStatsType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserStatsType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserStatsTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserStatsTypeReactiveObject.class index 038beedb..1dad15fc 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserStatsTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserStatsTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserStatsType__1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserStatsType__1.class index ac6defd9..091a791b 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserStatsType__1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserStatsType__1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserStatsType__1ReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserStatsType__1ReactiveObject.class index 3f43420f..e18890ad 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserStatsType__1ReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserStatsType__1ReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserType.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserType.class index 126cfd14..c6984029 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserType.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserType.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserTypeReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserTypeReactiveObject.class index 8b54fb5a..529e06f9 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserTypeReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserTypeReactiveObject.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserType__1.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserType__1.class index 5e8e1a9d..fe4c61b8 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserType__1.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserType__1.class differ diff --git a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserType__1ReactiveObject.class b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserType__1ReactiveObject.class index 774922a1..dd3bc7ea 100644 Binary files a/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserType__1ReactiveObject.class and b/unpackage/cache/.app-android/class/uni/UNICONSUMER/UserType__1ReactiveObject.class differ diff --git a/unpackage/cache/.app-android/dex/index/classes.dex b/unpackage/cache/.app-android/dex/index/classes.dex index 38a370b3..7b3ac2a5 100644 Binary files a/unpackage/cache/.app-android/dex/index/classes.dex and b/unpackage/cache/.app-android/dex/index/classes.dex differ diff --git a/unpackage/cache/.app-android/dex/pages/main/cart/classes.dex b/unpackage/cache/.app-android/dex/pages/main/cart/classes.dex index c88a8b0e..b12607df 100644 Binary files a/unpackage/cache/.app-android/dex/pages/main/cart/classes.dex and b/unpackage/cache/.app-android/dex/pages/main/cart/classes.dex differ diff --git a/unpackage/cache/.app-android/dex/pages/main/category/classes.dex b/unpackage/cache/.app-android/dex/pages/main/category/classes.dex index 3fba2d1c..d5dd9e80 100644 Binary files a/unpackage/cache/.app-android/dex/pages/main/category/classes.dex and b/unpackage/cache/.app-android/dex/pages/main/category/classes.dex differ diff --git a/unpackage/cache/.app-android/dex/pages/main/index/classes.dex b/unpackage/cache/.app-android/dex/pages/main/index/classes.dex index aceb9d3c..cdf8cd92 100644 Binary files a/unpackage/cache/.app-android/dex/pages/main/index/classes.dex and b/unpackage/cache/.app-android/dex/pages/main/index/classes.dex differ diff --git a/unpackage/cache/.app-android/dex/pages/main/messages/classes.dex b/unpackage/cache/.app-android/dex/pages/main/messages/classes.dex index 455270c9..0fe16418 100644 Binary files a/unpackage/cache/.app-android/dex/pages/main/messages/classes.dex and b/unpackage/cache/.app-android/dex/pages/main/messages/classes.dex differ diff --git a/unpackage/cache/.app-android/dex/pages/main/profile/classes.dex b/unpackage/cache/.app-android/dex/pages/main/profile/classes.dex index 7e8e6442..c5158f4c 100644 Binary files a/unpackage/cache/.app-android/dex/pages/main/profile/classes.dex and b/unpackage/cache/.app-android/dex/pages/main/profile/classes.dex differ diff --git a/unpackage/cache/.app-android/dex/pages/mall/consumer/address-edit/classes.dex b/unpackage/cache/.app-android/dex/pages/mall/consumer/address-edit/classes.dex index bad7dd72..062eefe1 100644 Binary files a/unpackage/cache/.app-android/dex/pages/mall/consumer/address-edit/classes.dex and b/unpackage/cache/.app-android/dex/pages/mall/consumer/address-edit/classes.dex differ diff --git a/unpackage/cache/.app-android/dex/pages/mall/consumer/address-list/classes.dex b/unpackage/cache/.app-android/dex/pages/mall/consumer/address-list/classes.dex index 9ef697f2..8e26b4ed 100644 Binary files a/unpackage/cache/.app-android/dex/pages/mall/consumer/address-list/classes.dex and b/unpackage/cache/.app-android/dex/pages/mall/consumer/address-list/classes.dex differ diff --git a/unpackage/cache/.app-android/dex/pages/mall/consumer/apply-refund/classes.dex b/unpackage/cache/.app-android/dex/pages/mall/consumer/apply-refund/classes.dex index f422ed63..c2a78db2 100644 Binary files a/unpackage/cache/.app-android/dex/pages/mall/consumer/apply-refund/classes.dex and b/unpackage/cache/.app-android/dex/pages/mall/consumer/apply-refund/classes.dex differ diff --git a/unpackage/cache/.app-android/dex/pages/mall/consumer/checkout/classes.dex b/unpackage/cache/.app-android/dex/pages/mall/consumer/checkout/classes.dex index 5d80a727..dfcf4ced 100644 Binary files a/unpackage/cache/.app-android/dex/pages/mall/consumer/checkout/classes.dex and b/unpackage/cache/.app-android/dex/pages/mall/consumer/checkout/classes.dex differ diff --git a/unpackage/cache/.app-android/dex/pages/mall/consumer/logistics/classes.dex b/unpackage/cache/.app-android/dex/pages/mall/consumer/logistics/classes.dex index 0458f9ba..32781e22 100644 Binary files a/unpackage/cache/.app-android/dex/pages/mall/consumer/logistics/classes.dex and b/unpackage/cache/.app-android/dex/pages/mall/consumer/logistics/classes.dex differ diff --git a/unpackage/cache/.app-android/dex/pages/mall/consumer/order-detail/classes.dex b/unpackage/cache/.app-android/dex/pages/mall/consumer/order-detail/classes.dex index 277f7a25..67573d43 100644 Binary files a/unpackage/cache/.app-android/dex/pages/mall/consumer/order-detail/classes.dex and b/unpackage/cache/.app-android/dex/pages/mall/consumer/order-detail/classes.dex differ diff --git a/unpackage/cache/.app-android/dex/pages/mall/consumer/orders/classes.dex b/unpackage/cache/.app-android/dex/pages/mall/consumer/orders/classes.dex index 4f69ca8a..2f0c5053 100644 Binary files a/unpackage/cache/.app-android/dex/pages/mall/consumer/orders/classes.dex and b/unpackage/cache/.app-android/dex/pages/mall/consumer/orders/classes.dex differ diff --git a/unpackage/cache/.app-android/dex/pages/mall/consumer/review/classes.dex b/unpackage/cache/.app-android/dex/pages/mall/consumer/review/classes.dex index fb7b175e..79ee4046 100644 Binary files a/unpackage/cache/.app-android/dex/pages/mall/consumer/review/classes.dex and b/unpackage/cache/.app-android/dex/pages/mall/consumer/review/classes.dex differ diff --git a/unpackage/cache/.app-android/dex/pages/mall/consumer/wallet/classes.dex b/unpackage/cache/.app-android/dex/pages/mall/consumer/wallet/classes.dex index 45384dfd..fc0c87b5 100644 Binary files a/unpackage/cache/.app-android/dex/pages/mall/consumer/wallet/classes.dex and b/unpackage/cache/.app-android/dex/pages/mall/consumer/wallet/classes.dex differ diff --git a/unpackage/cache/.app-android/sourcemap/index.kt.map b/unpackage/cache/.app-android/sourcemap/index.kt.map index 2781212d..6ea4e5e3 100644 --- a/unpackage/cache/.app-android/sourcemap/index.kt.map +++ b/unpackage/cache/.app-android/sourcemap/index.kt.map @@ -1 +1 @@ -{"version":3,"sources":["../../../../../../../HBuilderX/HBuilderX/plugins/uniapp-cli-vite/node_modules/@dcloudio/uni-console/src/runtime/app/socket.ts","uni_modules/ak-req/ak-req.uts","App.uvue","../../../../../../../HBuilderX/HBuilderX/plugins/uniapp-cli-vite/node_modules/@dcloudio/uni-console/src/runtime/app/index.ts","uni_modules/ak-req/interface.uts","ak/config.uts","uni_modules/i18n/index.uts","utils/utils.uts","components/supadb/aksupa.uts","components/supadb/aksupainstance.uts","types/mall-types.uts","pages/sense/types.uts","utils/sapi.uts","utils/store.uts","main.uts","utils/supabaseService.uts","pages/main/index.uvue","pages/main/category.uvue","pages/main/cart.uvue","pages/main/profile.uvue","pages/mall/consumer/settings.uvue","pages/mall/consumer/wallet.uvue","pages/mall/consumer/withdraw.uvue","pages/mall/consumer/search.uvue","pages/mall/consumer/shop-detail.uvue","pages/mall/consumer/coupons.uvue","pages/mall/consumer/favorites.uvue","pages/mall/consumer/footprint.uvue","pages/mall/consumer/address-list.uvue","pages/mall/consumer/address-edit.uvue","pages/mall/consumer/checkout.uvue","pages/mall/consumer/payment.uvue","pages/mall/consumer/orders.uvue","pages/mall/consumer/order-detail.uvue","pages/mall/consumer/logistics.uvue","pages/mall/consumer/review.uvue","pages/mall/consumer/refund.uvue","pages/mall/consumer/chat.uvue","pages/mall/consumer/subscription/followed-shops.uvue","pages/mall/consumer/points/index.uvue","pages/mall/consumer/points/signin.uvue","pages/mall/consumer/points/exchange.uvue","pages/mall/consumer/points/exchange-records.uvue","pages/mall/consumer/product-reviews.uvue","pages/mall/consumer/my-reviews.uvue","pages/mall/consumer/balance/index.uvue","pages/mall/consumer/share/index.uvue","pages/mall/consumer/share/detail.uvue","pages/mall/consumer/member/index.uvue","pages/mall/consumer/message-detail.uvue","pages/mall/consumer/red-packets/index.uvue","pages/mall/consumer/bank-cards/index.uvue","pages/mall/consumer/bank-cards/add.uvue"],"sourcesContent":["/// \n// 之所以又写了一份,是因为外层的socket,connectSocket的时候必须传入multiple:true\n// 但是android又不能传入,目前代码里又不能写条件编译之类的。\nexport function initRuntimeSocket(\n hosts: string,\n port: string,\n id: string\n): Promise {\n if (hosts == '' || port == '' || id == '') return Promise.resolve(null)\n return hosts\n .split(',')\n .reduce>(\n (\n promise: Promise,\n host: string\n ): Promise => {\n return promise.then((socket): Promise => {\n if (socket != null) return Promise.resolve(socket)\n return tryConnectSocket(host, port, id)\n })\n },\n Promise.resolve(null)\n )\n}\n\nconst SOCKET_TIMEOUT = 500\nfunction tryConnectSocket(\n host: string,\n port: string,\n id: string\n): Promise {\n return new Promise((resolve, reject) => {\n const socket = uni.connectSocket({\n url: `ws://${host}:${port}/${id}`,\n fail() {\n resolve(null)\n },\n })\n const timer = setTimeout(() => {\n // @ts-expect-error\n socket.close({\n code: 1006,\n reason: 'connect timeout',\n } as CloseSocketOptions)\n resolve(null)\n }, SOCKET_TIMEOUT)\n\n socket.onOpen((e) => {\n clearTimeout(timer)\n resolve(socket)\n })\n socket.onClose((e) => {\n clearTimeout(timer)\n resolve(null)\n })\n socket.onError((e) => {\n clearTimeout(timer)\n resolve(null)\n })\n })\n}\n","import { AkReqUploadOptions, AkReqOptions, AkReqResponse, AkReqError } from './interface.uts';\r\nimport { SUPA_URL, SUPA_KEY, IS_TEST_MODE } from '@/ak/config.uts';\r\n\r\n// token 持久化 key\r\nconst ACCESS_TOKEN_KEY = 'akreq_access_token';\r\nconst REFRESH_TOKEN_KEY = 'akreq_refresh_token';\r\nconst EXPIRES_AT_KEY = 'akreq_expires_at';\r\n\r\n// 优化:用静态变量缓存 token,只有 set/clear 时同步 storage\r\nlet _accessToken : string | null = null;\r\nlet _refreshToken : string | null = null;\r\nlet _expiresAt : number | null = null;\r\n\r\nexport class AkReq {\r\n\tstatic setToken(token : string, refreshToken : string, expiresAt : number) {\r\n\t\t_accessToken = token;\r\n\t\t_refreshToken = refreshToken;\r\n\t\t_expiresAt = expiresAt;\r\n\t\tuni.setStorageSync(ACCESS_TOKEN_KEY, token);\r\n\t\tuni.setStorageSync(REFRESH_TOKEN_KEY, refreshToken);\r\n\t\tuni.setStorageSync(EXPIRES_AT_KEY, expiresAt);\r\n\t}\r\n\tstatic getToken() : string | null {\r\n\t\tif (_accessToken != null) return _accessToken;\r\n\t\tconst t = uni.getStorageSync(ACCESS_TOKEN_KEY) as string | null;\r\n\t\t_accessToken = t;\r\n\t\treturn t;\r\n\t}\r\n\tstatic getRefreshToken() : string | null {\r\n\t\tif (_refreshToken != null) return _refreshToken;\r\n\t\tconst t = uni.getStorageSync(REFRESH_TOKEN_KEY) as string | null;\r\n\t\t_refreshToken = t;\r\n\t\treturn t;\r\n\t} static getExpiresAt() : number | null {\r\n\t\tconst val = _expiresAt;\r\n\t\tif (val != null) return val;\r\n\t\tconst t = uni.getStorageSync(EXPIRES_AT_KEY) as number | null;\r\n\t\t_expiresAt = t;\r\n\t\treturn t;\r\n\t}\r\n\tstatic clearToken() {\r\n\t\t_accessToken = null;\r\n\t\t_refreshToken = null;\r\n\t\t_expiresAt = null;\r\n\t\tuni.removeStorageSync(ACCESS_TOKEN_KEY);\r\n\t\tuni.removeStorageSync(REFRESH_TOKEN_KEY);\r\n\t\tuni.removeStorageSync(EXPIRES_AT_KEY);\r\n\t}\t// 判断 token 是否即将过期(提前5分钟刷新)\r\n\tstatic isTokenExpiring() : boolean {\r\n\t\tconst expiresAt = this.getExpiresAt();\r\n\t\tif (expiresAt === null || expiresAt == 0) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tconst now = Math.floor(Date.now() / 1000);\r\n\t\treturn (expiresAt - now) < 300; // 提前5分钟刷新\r\n\t}\r\n\r\n\t// 自动刷新 token,返回 true=已刷新,false=未刷新\r\n\tstatic async refreshTokenIfNeeded(apikey ?: string) : Promise {\r\n\t\t// 没有 access_token 直接返回,不刷新\r\n\t\tconst accessToken = this.getToken();\r\n\t\tif (accessToken === null || accessToken === \"\") {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif (!this.isTokenExpiring()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tconst refreshToken = this.getRefreshToken();\r\n\t\tif (refreshToken === null || refreshToken === \"\") {\r\n\t\t\tthis.clearToken();\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\t// 构造 header,必须带 apikey\r\n\t\tlet headers = new UTSJSONObject();\r\n\t\tif (apikey !== null && apikey !== \"\") {\r\n\t\t\theaders.set('apikey', apikey)\r\n\t\t}\r\n\t\tconst reqData = new UTSJSONObject()\r\n\t\treqData.set('refresh_token', refreshToken)\r\n\t\ttry {\r\n\t\t\tconst res = await this.request({\r\n\t\t\t\turl: SUPA_URL + '/auth/v1/token?grant_type=refresh_token',\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\tdata: reqData,\r\n\t\t\t\theaders: headers,\r\n\t\t\t\tcontentType: 'application/json'\r\n\t\t\t}, true); // skipRefresh=true,避免递归\r\n\t\t\tconst data = res.data as UTSJSONObject | null;\r\n\t\t\tlet accessToken : string | null = null;\r\n\t\t\tlet refreshTokenNew : string | null = null;\r\n\t\t\tlet expiresAt : number | null = null;\r\n\t\t\tif (data != null && typeof data.getString === 'function' && typeof data.getNumber === 'function') {\r\n\t\t\t\taccessToken = data.getString('access_token');\r\n\t\t\t\trefreshTokenNew = data.getString('refresh_token');\r\n\t\t\t\texpiresAt = data.getNumber('expires_at');\r\n\t\t\t}\r\n\t\t\tif (accessToken !== null && refreshTokenNew !== null && expiresAt !== null) {\r\n\t\t\t\tthis.setToken(accessToken, refreshTokenNew, expiresAt);\r\n\t\t\t\treturn true;\r\n\t\t\t} else {\r\n\t\t\t\tthis.clearToken();\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t} catch (e) {\r\n\t\t\tthis.clearToken();\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\t// options: AkReqOptions, skipRefresh: boolean = false\r\n\tstatic async request(options : AkReqOptions, skipRefresh ?: boolean) : Promise> {\r\n\t\t// 自动刷新 token\r\n\t\tif (skipRefresh != true) {\r\n\t\t\tlet apikey : string | null = null;\r\n\t\t\tconst headersObj = options.headers;\r\n\t\t\tif (headersObj != null && typeof headersObj.getString === 'function') {\r\n\t\t\t\tapikey = headersObj.getString('apikey');\r\n\t\t\t}\r\n\t\t\tawait this.refreshTokenIfNeeded(apikey);\r\n\t\t}\r\n\r\n\t\t// 构建新的 headers 对象,确保所有字段都被正确传递\r\n\t\tconst newHeaders = new UTSJSONObject()\r\n\t\t\r\n\t\t// 首先复制原始 headers\r\n\t\tif (options.headers != null) {\r\n\t\t\tconst originalHeaders = options.headers\r\n\t\t\tif (typeof originalHeaders.getString === 'function') {\r\n\t\t\t\t// 复制 apikey\r\n\t\t\t\tconst apikeyStr = originalHeaders.getString('apikey')\r\n\t\t\t\tif (apikeyStr != null) {\r\n\t\t\t\t\tnewHeaders.set('apikey', apikeyStr)\r\n\t\t\t\t}\r\n\t\t\t\t// 复制 Content-Type\r\n\t\t\t\tconst contentType = originalHeaders.getString('Content-Type')\r\n\t\t\t\tif (contentType != null) {\r\n\t\t\t\t\tnewHeaders.set('Content-Type', contentType)\r\n\t\t\t\t}\r\n\t\t\t\t// 复制 Prefer\r\n\t\t\t\tconst prefer = originalHeaders.getString('Prefer')\r\n\t\t\t\tif (prefer != null) {\r\n\t\t\t\t\tnewHeaders.set('Prefer', prefer)\r\n\t\t\t\t}\r\n\t\t\t\t// 复制 Authorization(如果存在)\r\n\t\t\t\tconst auth = originalHeaders.getString('Authorization')\r\n\t\t\t\tif (auth != null) {\r\n\t\t\t\t\tnewHeaders.set('Authorization', auth)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// 补齐 apikey (如果 headers 中没有,则直接使用 SUPA_KEY 补全)\r\n\t\tif (newHeaders.getString('apikey') == null) {\r\n\t\t\tif (SUPA_KEY != null && SUPA_KEY != \"\") {\r\n\t\t\t\tnewHeaders.set('apikey', SUPA_KEY)\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// 添加/更新 Authorization\r\n\t\tconst token = this.getToken();\r\n\t\tif (token != null && token != \"\") {\r\n\t\t\tnewHeaders.set('Authorization', `Bearer ${token}`)\r\n\t\t}\r\n\t\t\r\n\t\t// 确保 Content-Type 存在\r\n\t\tif (newHeaders.getString('Content-Type') == null) {\r\n\t\t\tconst contentType = options.contentType ?? 'application/json'\r\n\t\t\tif (contentType != null && contentType != \"\") {\r\n\t\t\t\tnewHeaders.set('Content-Type', contentType)\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// 添加 Accept\r\n\t\tnewHeaders.set('Accept', 'application/json')\r\n\t\t\r\n\t\t__f__('log','at uni_modules/ak-req/ak-req.uts:175','[AkReq.request] headers:', JSON.stringify(newHeaders))\r\n\t\t\r\n\t\tconst headers = newHeaders\r\n\r\n\t\tconst timeout = options.timeout ?? 10000;\r\n\t\tconst maxRetry = Math.max(0, options.retryCount ?? 0);\r\n\t\tconst baseDelay = Math.max(0, options.retryDelayMs ?? 300);\r\n\r\n\t\tconst doOnce = (): Promise> => {\r\n\t\t\treturn new Promise>((resolve) => {\r\n\t\t\t\tuni.request({\r\n\t\t\t\t\turl: options.url,\r\n\t\t\t\t\tmethod: options.method ?? 'GET',\r\n\t\t\t\t\tdata: options.data,\r\n\t\t\t\t\theader: headers,\r\n\t\t\t\t\ttimeout: timeout,\r\n\t\t\t\t\tsuccess: (res) => {\r\n\t\t\t\t\t\t// HEAD 请求特殊处理:没有响应体,只有 headers\r\n\t\t\t\t\t\tif (options.method == 'HEAD') {\r\n\t\t\t\t\t\t\tconst result = AkReq.createResponse(\r\n\t\t\t\t\t\t\t\tres.statusCode,\r\n\t\t\t\t\t\t\t\t[] as Array,\r\n\t\t\t\t\t\t\t\tres.header as UTSJSONObject\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\tresolve(result);\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// 兼容 res.data 可能为 string 或 UTSJSONObject 或 UTSArray\r\n\t\t\t\t\t\tlet data : UTSJSONObject | Array | null;\r\n\t\t\t\t\t\tif (typeof res.data == 'string') {\r\n\t\t\t\t\t\t\tconst strData = res.data as string;\r\n\t\t\t\t\t\t\tif (strData.length > 0 && /[^\\s]/.test(strData)) {\r\n\t\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\t\tdata = JSON.parse(strData) as UTSJSONObject;\r\n\t\t\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t\t\t// 非 JSON 响应(例如纯文本/空响应/数字等),保持原始字符串,避免 JSON.parse 崩溃\r\n\t\t\t\t\t\t\t\t\tdata = new UTSJSONObject({ raw: strData });\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tdata = null;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else if (Array.isArray(res.data)) {\r\n\t\t\t\t\t\t\tdata = res.data as UTSJSONObject[];\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tconst objData = res.data as UTSJSONObject | null;\r\n\t\t\t\t\t\t\tdata = objData;\r\n\t\t\t\t\t\t\tif (objData != null) {\r\n\t\t\t\t\t\t\t\tconst accessToken = objData.getString('access_token');\r\n\t\t\t\t\t\t\t\tconst refreshTokenNew = objData.getString('refresh_token');\r\n\t\t\t\t\t\t\t\tconst expiresAt = objData.getNumber('expires_at');\r\n\t\t\t\t\t\t\t\tif (accessToken !== null && refreshTokenNew !== null && expiresAt !== null) {\r\n\t\t\t\t\t\t\t\t\tAkReq.setToken(accessToken, refreshTokenNew, expiresAt);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tconst result = AkReq.createResponse(\r\n\t\t\t\t\t\t\tres.statusCode,\r\n\t\t\t\t\t\t\tdata ?? {},\r\n\t\t\t\t\t\t\tres.header as UTSJSONObject\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t\tresolve(result);\r\n\t\t\t\t\t},\r\n\t\t\t\t\tfail: (err) => {\r\n\t\t\t\t\t\tconst errStatus = (err.errCode != null && typeof err.errCode === 'number') ? err.errCode : 0;\r\n\t\t\t\t\t\tconst result = AkReq.createResponse(\r\n\t\t\t\t\t\t\terrStatus,\r\n\t\t\t\t\t\t\t{} as UTSJSONObject,\r\n\t\t\t\t\t\t\t{} as UTSJSONObject,\r\n\t\t\t\t\t\t\tnew UniError('uni-request', errStatus, err.errMsg ?? 'request fail')\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t\tresolve(result);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tlet attempt = 0;\r\n\t\tlet lastRes: AkReqResponse | null = null;\r\n\t\twhile (attempt <= maxRetry) {\r\n\t\t\tconst res = await doOnce();\r\n\t\t\tlastRes = res;\r\n\t\t\t// 仅网络失败/超时(errCode 非 0 且 status 非 2xx/3xx)时重试\r\n\t\t\tconst status = res.status ?? 0;\r\n\t\t\tconst isOk = status >= 200 && status < 400;\r\n\t\t\tif (isOk) return res;\r\n\t\t\tif (attempt === maxRetry) break;\r\n\t\t\t// 简单退避\r\n\t\t\tconst delay = baseDelay * Math.pow(2, attempt);\r\n await new Promise((r) => { setTimeout(() => { r(); }, delay); });\r\n\t\t\tattempt++;\r\n\t\t}\r\n\t\tconst finalRes = lastRes!!;\r\n\t\t// 全局处理 401 未授权:在非 refresh 场景下,清理 token。\r\n\t\t// 测试模式下不强制跳登录页,避免影响任意跳转调试。\r\n\t\tif ((finalRes.status === 401) && (skipRefresh !== true)) {\r\n\t\t\ttry {\r\n\t\t\t\tthis.clearToken();\r\n\t\t\t\tuni.showToast({ title: '未授权或登录已过期,请重新登录', icon: 'none' });\r\n\t\t\t} catch (e) {}\r\n\t\t\ttry {\r\n\t\t\t\t// 动态读取配置,避免 ak-req 模块与业务工程强耦合\r\n\t\t\t\t// const cfg = require('@/ak/config.uts') as any\r\n\t\t\t\t// const isTest = cfg != null ? (cfg.IS_TEST_MODE === true) : false\r\n const isTest = IS_TEST_MODE\r\n\t\t\t\t// if (!isTest) {\r\n\t\t\t\t// \tuni.reLaunch({ url: '/pages/user/login' });\r\n\t\t\t\t// }\r\n\t\t\t} catch (e) {\r\n\t\t\t\t// try { uni.reLaunch({ url: '/pages/user/login' }); } catch (e2) {}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn finalRes;\r\n\t}\r\n\r\n\t// 新增 upload 方法,支持 uni.uploadFile,自动带 token/apikey\t\r\n\tstatic async upload(options : AkReqUploadOptions) : Promise> {\r\n\t\t// 上传前尝试刷新 token(若即将过期)。优先从 options.headers 或 apikey 字段获取 apikey\r\n\t\tlet apikey: string | null = null;\r\n\t\tconst hdr = options.headers;\r\n\t\tif (hdr != null && typeof hdr.getString === 'function') {\r\n\t\t\tapikey = hdr.getString('apikey');\r\n\t\t}\r\n if (apikey == null && options.apikey != null) apikey = options.apikey;\r\n await this.refreshTokenIfNeeded(apikey != null ? apikey : null);\r\n\r\n\t\tlet headers = options.headers ?? ({} as UTSJSONObject);\r\n\t\tconst token = this.getToken();\r\n\t\tif (token != null && token !== \"\") {\r\n\t\t\theaders = Object.assign({}, headers, { Authorization: `Bearer ${token}` }) as UTSJSONObject;\r\n\t\t}\r\n if (apikey != null && apikey !== \"\") {\r\n\t\t\theaders = Object.assign({}, headers, { apikey: apikey }) as UTSJSONObject;\r\n\t\t}\r\n\t\t// 默认 Accept\r\n\t\theaders = Object.assign({ Accept: 'application/json' } as UTSJSONObject, headers) as UTSJSONObject;\r\n\r\n\t\tconst timeout = options.timeout ?? 10000;\r\n\t\tconst maxRetry = Math.max(0, options.retryCount ?? 0);\r\n\t\tconst baseDelay = Math.max(0, options.retryDelayMs ?? 300);\r\n\r\n\t\tconst doOnce = (): Promise> => {\r\n\t\t\treturn new Promise>((resolve) => {\r\n\t\tconst task = uni.uploadFile({\r\n\t\t\turl: options.url,\r\n\t\t\tfilePath: options.filePath,\r\n\t\t\tname: options.name,\r\n\t\t\tformData: options.formData ?? {},\r\n\t\t\theader: headers,\r\n\t\t\ttimeout: timeout,\r\n\t\t\tsuccess: (res : UploadFileSuccess) => {\r\n\t\t\t\tlet parsed: UTSJSONObject | null = null;\r\n\t\t\t\ttry {\r\n\t\t\t\t\tparsed = JSON.parse(res.data) as UTSJSONObject;\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tparsed = null;\r\n\t\t\t\t}\r\n\t\t\t\tif (parsed != null) {\r\n\t\t\t\t\tconst accessToken = parsed.getString('access_token');\r\n\t\t\t\t\tconst refreshTokenNew = parsed.getString('refresh_token');\r\n\t\t\t\t\tconst expiresAt = parsed.getNumber('expires_at');\r\n\t\t\t\t\tif (accessToken !== null && refreshTokenNew !== null && expiresAt !== null) {\r\n\t\t\t\t\t\tAkReq.setToken(accessToken, refreshTokenNew, expiresAt);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tconst result = AkReq.createResponse(\r\n\t\t\t\t\tres.statusCode,\r\n\t\t\t\t\tparsed ?? {},\r\n\t\t\t\t\theaders\r\n\t\t\t\t);\r\n\t\t\t\tresolve(result);\r\n\t\t\t},\r\n\t\t\tfail: (err) => {\r\n\t\t\t\tconst errStatus = (err.errCode != null && typeof err.errCode === 'number') ? err.errCode : 0;\r\n\t\t\t\tconst result = AkReq.createResponse(\r\n\t\t\t\t\terrStatus,\r\n\t\t\t\t\t{} as UTSJSONObject,\r\n\t\t\t\t\t{} as UTSJSONObject,\r\n\t\t\t\t\tnew UniError('uni-upload', errStatus, err.errMsg ?? 'upload fail')\r\n\t\t\t\t);\r\n\t\t\t\tresolve(result);\r\n\t\t\t}\r\n\t\t});\r\n\t\tif (options.onProgress != null && task != null) {\r\n\t\t\tconst progressCallback = (res: OnProgressUpdateResult) => {\r\n\t\t\t\tconst percent = res.progress as number; // 0-100\r\n\t\t\t\tconst sent = res.totalBytesSent as number | null;\r\n\t\t\t\tconst expected = res.totalBytesExpectedToSend as number | null;\r\n\t\t\t\tif (options.onProgress != null) {\r\n\t\t\t\t\toptions.onProgress(percent, sent, expected);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\ttask.onProgressUpdate(progressCallback);\r\n\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tlet attempt = 0;\r\n\t\tlet lastRes: AkReqResponse | null = null;\r\n\t\twhile (attempt <= maxRetry) {\r\n\t\t\tconst res = await doOnce();\r\n\t\t\tlastRes = res;\r\n\t\t\tconst status = res.status ?? 0;\r\n\t\t\tconst isOk = status >= 200 && status < 400;\r\n\t\t\tif (isOk) return res;\r\n\t\t\tif (attempt === maxRetry) break;\r\n\t\t\tconst delay = baseDelay * Math.pow(2, attempt);\r\n\t\t\tawait new Promise((resolve) => {\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tresolve();\r\n\t\t\t\t}, delay);\r\n\t\t\t});\r\n\t\t\tattempt++;\r\n\t\t}\r\n\t\treturn lastRes!!;\r\n\t}\r\n\t// 辅助方法:创建 AkReqResponse 对象,避免类型推断问题\r\n\tstatic createResponse(\r\n\t\tstatus: number,\r\n\t\tdata: T | Array ,\r\n\t\theaders: UTSJSONObject,\r\n\t\terror: UniError | null = null,\r\n\t\ttotal: number | null = null,\r\n\t\tpage: number | null = null,\r\n\t\tlimit: number | null = null,\r\n\t\thasmore: boolean | null = null,\r\n\t\torigin: any | null = null\r\n\t): AkReqResponse {\r\n\t\treturn {\r\n\t\t\tstatus,\r\n\t\t\tdata,\r\n\t\t\theaders,\r\n\t\t\terror,\r\n\t\t\ttotal,\r\n\t\t\tpage,\r\n\t\t\tlimit,\r\n\t\t\thasmore,\r\n\t\t\torigin\r\n\t\t};\r\n\t}\r\n\r\n}\r\n\r\nexport default AkReq;","\r\n\r\n\r\n","import { initRuntimeSocket } from './socket'\n\nexport function initRuntimeSocketService(): Promise {\n const hosts: string = process.env.UNI_SOCKET_HOSTS\n const port: string = process.env.UNI_SOCKET_PORT\n const id: string = process.env.UNI_SOCKET_ID\n if (hosts == '' || port == '' || id == '') return Promise.resolve(false)\n let socketTask: SocketTask | null = null\n __registerWebViewUniConsole(\n (): string => {\n return process.env.UNI_CONSOLE_WEBVIEW_EVAL_JS_CODE\n },\n (data: string) => {\n socketTask?.send({\n data,\n } as SendSocketMessageOptions)\n }\n )\n return Promise.resolve()\n .then((): Promise => {\n return initRuntimeSocket(hosts, port, id).then((socket): boolean => {\n if (socket == null) {\n return false\n }\n socketTask = socket\n return true\n })\n })\n .catch((): boolean => {\n return false\n })\n}\n\ninitRuntimeSocketService()\n","// ak-req 类型定义\r\nexport type AkReqOptions = {\r\n url: string;\r\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' |'HEAD';\r\n data?: UTSJSONObject | Array;\r\n headers?: UTSJSONObject;\r\n timeout?: number;\r\n contentType?: string; // 新增,支持顶级 contentType\r\n // 可选:重试设置(仅网络错误/超时触发)。默认重试 0 次\r\n retryCount?: number; // 最大重试次数,默认 0\r\n retryDelayMs?: number; // 首次重试延迟,默认 300ms,指数退避\r\n};\r\n// 上传参数类型定义\r\nexport type AkReqUploadOptions = {\r\n url: string,\r\n filePath: string,\r\n name: string,\r\n formData?: UTSJSONObject,\r\n headers?: UTSJSONObject,\r\n apikey?: string,\r\n timeout?: number,\r\n // 进度回调,0-100(注意:H5/APP 平台支持不同)\r\n onProgress?: (progress: number, transferredBytes?: number, totalBytes?: number) => void,\r\n // 可选:重试设置(仅网络错误/超时触发)。默认 0\r\n retryCount?: number,\r\n retryDelayMs?: number\r\n};\r\n\r\nexport type AkReqResponse = {\r\n status: number;\r\n data: T | Array | null; // 支持 null\r\n headers: UTSJSONObject;\r\n error: UniError | null;\r\n total:number |null;\r\n page: number |null;\r\n limit: number |null;\r\n hasmore:boolean |null;\r\n origin: any | null;\r\n};\r\n\r\nexport class AkReqError extends Error {\r\n code: number;\r\n constructor(message: string, code: number = 0) {\r\n super(message);\r\n this.code = code;\r\n this.name = 'AkReqError';\r\n }\r\n}\r\n","// Supabase 配置\r\n// 内网环境 - 本地部署的 Supabase\r\n// IP: 192.168.1.62\r\n// Kong HTTP Port: 8000\r\n\r\n//export const SUPA_URL: string = 'http://192.168.1.61:18000'\r\n//export const SUPA_KEY: string = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlzcyI6InN1cGFiYXNlLTEiLCJpYXQiOjE3Njk2NzY0OTgsImV4cCI6MTkyNzM1NjQ5OH0.ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'\r\nexport const SUPA_URL: string = 'http://119.146.131.237:9126'\r\nexport const SUPA_KEY: string = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlzcyI6InN1cGFiYXNlLTEiLCJpYXQiOjE3Njk2NzY0OTgsImV4cCI6MTkyNzM1NjQ5OH0.ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'\r\n\r\n// WebSocket 实时连接(内网使用 ws:// 而非 wss://)\r\nexport const WS_URL: string = 'ws://119.146.131.237:9126/realtime/v1/websocket'\r\n//export const WS_URL: string = 'ws://localhost:18000/realtime/v1/websocket'\r\n\r\n// 备用配置(已注释,如需切换可取消注释)\r\n// 开发环境 - 其他内网地址\r\n// export const SUPA_URL: string = 'http://192.168.0.150:8080'\r\n// export const SUPA_KEY: string = 'your-anon-key'\r\n// export const WS_URL: string = 'ws://192.168.0.150:8080/realtime/v1/websocket'\r\n\r\n// 生产环境 - Supabase 云服务(已注释)\r\n// export const SUPA_URL: string = 'https://ak3.oulog.com'\r\n// export const SUPA_KEY: string = 'your-anon-key'\r\n// export const WS_URL: string = 'wss://ak3.oulog.com/realtime/v1/websocket'\r\n\r\n// 指向你的 Supabase 服务(开发/私有部署)\r\n// export const SUPA_URL: string = 'http://192.168.1.64:3000'\r\n// export const SUPA_KEY: string = 'your-anon-key'\r\n// export const WS_URL: string = 'ws://192.168.1.64:3000/realtime/v1'\r\n\r\n// 路由配置\r\nexport const HOME_REDIRECT: string = '/pages/main/index'\r\nexport const TABORPAGE: string = '/pages/main/index'\r\n\r\n// 测试模式:放开任意跳转(禁用启动页/登录/401 的强制重定向)\r\nexport const IS_TEST_MODE: boolean = true","// i18n 国际化配置\r\n// 这是一个简化的 i18n 实现,用于支持多语言切换\r\n\r\n// 语言资源\r\nconst messages: UTSJSONObject = new UTSJSONObject()\r\n\r\n// 默认语言\r\nconst defaultLocale = 'zh-CN'\r\n\r\n// 当前语言(响应式)\r\nlet currentLocale = defaultLocale\r\n\r\n// 翻译函数\r\nfunction t(key: string, values: UTSJSONObject | null = null, locale: string | null = null): string {\r\n\tconst targetLocale = locale ?? currentLocale\r\n\t// 这里应该从 messages 中获取翻译,简化实现直接返回 key\r\n\t// 实际项目中应该加载语言资源文件\r\n\treturn key\r\n}\r\n\r\n// 创建响应式 locale 对象\r\nclass LocaleWrapper {\r\n get value(): string {\r\n return currentLocale\r\n }\r\n set value(newLocale: string) {\r\n currentLocale = newLocale\r\n }\r\n}\r\nconst localeObj = new LocaleWrapper()\r\n\r\n// I18n Global Context\r\nclass I18nGlobal {\r\n\tt(key: string, values: UTSJSONObject | null = null, locale: string | null = null): string {\r\n\t\treturn t(key, values, locale)\r\n\t}\r\n\tlocale: LocaleWrapper = localeObj\r\n}\r\n\r\n// I18n Instance\r\nclass I18nInstance {\r\n\tglobal: I18nGlobal = new I18nGlobal()\r\n}\r\n\r\n// 导出 i18n 对象\r\nconst i18n = new I18nInstance()\r\nexport default i18n\r\n","// 通用 UTSJSONObject 转任意 type 的函数\r\n// UTS 2024\r\n\r\nimport i18n from '@/uni_modules/i18n/index.uts';\r\n\r\n/**\r\n * 切换应用语言设置\r\n * @param locale 语言代码,如 'zh-CN' 或 'en-US'\r\n */\r\nexport function switchLocale(locale: string) {\r\n // 设置存储\r\n uni.setStorageSync('uVueI18nLocale', locale);\r\n \r\n // 设置 i18n 语言\r\n try {\r\n if (i18n != null && i18n.global != null) {\r\n i18n.global.locale.value = locale;\r\n }\r\n } catch (err) {\r\n __f__('error','at utils/utils.uts:20','Failed to switch locale:', err);\r\n }\r\n}\r\n\r\n/**\r\n * 获取当前语言设置\r\n * @returns 当前语言代码\r\n */\r\nexport function getCurrentLocale(): string {\r\n const locale = uni.getStorageSync('uVueI18nLocale') as string;\r\n if (locale == null || locale == '') {\r\n return 'zh-CN';\r\n }\r\n return locale;\r\n}\r\n\r\n/**\r\n * 确保语言设置正确初始化\r\n */\r\nexport function ensureLocaleInitialized() {\r\n const currentLocale = getCurrentLocale();\r\n if (currentLocale == null || currentLocale == '') {\r\n switchLocale('zh-CN');\r\n }\r\n}\r\n/**\r\n * 将任意错误对象转换为标准的 UniError\r\n * @param error 任意类型的错误对象\r\n * @param defaultMessage 默认错误消息\r\n * @returns 标准化的 UniError 对象\r\n */\r\nexport function toUniError(error: any, defaultMessage: string = '操作失败'): UniError {\r\n // 如果已经是 UniError,直接返回\r\n if (error instanceof UniError) {\r\n return error\r\n }\r\n let errorMessage = defaultMessage\r\n let errorCode = -1\r\n \r\n try {\r\n // 如果是普通 Error 对象\r\n if (error instanceof Error) {\r\n errorMessage = error.message != null && error.message != '' ? error.message : defaultMessage\r\n }\r\n // 如果是字符串\r\n else if (typeof error === 'string') {\r\n errorMessage = error\r\n } // 如果是对象,尝试提取错误信息\r\n else if (error != null && typeof error === 'object') {\r\n const errorObj = error as UTSJSONObject\r\n let message: string = ''\r\n \r\n // 逐个检查字段,避免使用 || 操作符\r\n if (errorObj['message'] != null) {\r\n const msgValue = errorObj['message']\r\n if (typeof msgValue === 'string') {\r\n message = msgValue\r\n }\r\n } else if (errorObj['errMsg'] != null) {\r\n const msgValue = errorObj['errMsg']\r\n if (typeof msgValue === 'string') {\r\n message = msgValue\r\n }\r\n } else if (errorObj['error'] != null) {\r\n const msgValue = errorObj['error']\r\n if (typeof msgValue === 'string') {\r\n message = msgValue\r\n }\r\n } else if (errorObj['details'] != null) {\r\n const msgValue = errorObj['details']\r\n if (typeof msgValue === 'string') {\r\n message = msgValue\r\n }\r\n } else if (errorObj['msg'] != null) {\r\n const msgValue = errorObj['msg']\r\n if (typeof msgValue === 'string') {\r\n message = msgValue\r\n }\r\n }\r\n \r\n if (message != '') {\r\n errorMessage = message\r\n }\r\n \r\n // 尝试提取错误码\r\n let code: number = 0\r\n if (errorObj['code'] != null) {\r\n const codeValue = errorObj['code']\r\n if (typeof codeValue === 'number') {\r\n code = codeValue\r\n }\r\n } else if (errorObj['errCode'] != null) {\r\n const codeValue = errorObj['errCode']\r\n if (typeof codeValue === 'number') {\r\n code = codeValue\r\n }\r\n } else if (errorObj['status'] != null) {\r\n const codeValue = errorObj['status']\r\n if (typeof codeValue === 'number') {\r\n code = codeValue\r\n }\r\n }\r\n \r\n if (code != 0) {\r\n errorCode = code\r\n }\r\n }\r\n } catch (e) {\r\n __f__('error','at utils/utils.uts:128','Error converting to UniError:', e)\r\n errorMessage = defaultMessage\r\n }\r\n // 创建标准 UniError\r\n const uniError = new UniError('AppError', errorCode, errorMessage)\r\n return uniError\r\n}\r\n\r\n/**\r\n * 响应式状态管理\r\n * @returns 响应式状态对象\r\n */\r\nexport function responsiveState() {\r\n const screenInfo = uni.getSystemInfoSync()\r\n const screenWidth = screenInfo.screenWidth\r\n \r\n return {\r\n isLargeScreen: screenWidth >= 768,\r\n isSmallScreen: screenWidth < 576,\r\n screenWidth: screenWidth,\r\n cardColumns: screenWidth >= 768 ? 3 : screenWidth >= 576 ? 2 : 1\r\n }\r\n}\r\n\r\nexport function goToLogin(redirectUrl?: string | null) {\r\n try {\r\n const target = redirectUrl != null && redirectUrl.length > 0 ? redirectUrl : ''\r\n if (target.length > 0) {\r\n const redirect = encodeURIComponent(target)\r\n uni.navigateTo({ url: `/pages/user/login?redirect=${redirect}` })\r\n } else {\r\n uni.navigateTo({ url: '/pages/user/login' })\r\n }\r\n } catch (e) {\r\n uni.navigateTo({ url: '/pages/user/login' })\r\n }\r\n}\r\n\r\n/**\r\n * 兼容 UTS Android 的剪贴板写入\r\n * @param text 要写入剪贴板的文本\r\n */\r\nexport function setClipboard(text: string): void {\r\n\r\n\r\n\r\n}\r\n\r\n/**\r\n * 格式化时间,显示为相对时间(如:刚刚,几小时前)\r\n * @param dateStr ISO 格式的日期字符串\r\n * @returns 格式化后的相对时间字符串\r\n */\r\nexport function formatTime(dateStr: string): string {\r\n if (dateStr == '') return ''\r\n try {\r\n const date = new Date(dateStr)\r\n const now = new Date()\r\n const diff = now.getTime() - date.getTime()\r\n const hours = Math.floor(diff / (1000 * 60 * 60))\r\n \r\n if (hours < 1) {\r\n return '刚刚'\r\n } else if (hours < 24) {\r\n return `${hours}小时前`\r\n } else {\r\n return `${Math.floor(hours / 24)}天前`\r\n }\r\n } catch (e) {\r\n __f__('error','at utils/utils.uts:197','formatTime error:', e)\r\n return dateStr.replace('T', ' ').split('.')[0]\r\n }\r\n}\r\n\r\n","import { AkReqResponse, AkReqUploadOptions, AkReq } from '@/uni_modules/ak-req/index.uts'\r\nimport type { AkReqOptions } from '@/uni_modules/ak-req/index.uts'\r\nimport { toUniError } from '@/utils/utils.uts'\r\n\r\nexport type AkSupaSignInResult = {\r\n\taccess_token : string;\r\n\trefresh_token : string;\r\n\texpires_at : number;\r\n\tuser : UTSJSONObject | null;\r\n\ttoken_type ?: string;\r\n\texpires_in ?: number;\r\n\traw : UTSJSONObject;\r\n}\r\n\r\n// Count 选项枚举\r\nexport type CountOption = 'exact' | 'planned' | 'estimated';\r\n\r\n// 定义查询选项类型,兼容 UTS\r\nexport type AkSupaSelectOptions = {\r\n\tlimit ?: number;\r\n\torder ?: string;\r\n\tgetcount ?: string; // 保持向后兼容\r\n\tcount ?: CountOption; // 新增:更清晰的 count 选项\r\n\thead ?: boolean; // 新增:head 模式,只返回元数据\r\n\tcolumns ?: string;\r\n\tsingle ?: boolean; // 新增,支持 single-object\r\n\trangeFrom ?: number; // 新增:range 分页起始位置\r\n\trangeTo ?: number; // 新增:range 分页结束位置\r\n};\r\n\r\n// 新增:order方法参数类型\r\nexport type OrderOptions = {\r\n\tascending ?: boolean;\r\n};\r\n\r\n// 新增类型定义,便于 getSession 返回类型复用\r\nexport type AkSupaSessionInfo = {\r\n\tsession : AkSupaSignInResult | null;\r\n\tuser : UTSJSONObject | null;\r\n};\r\n\r\n// 链式请求构建器\r\n// 强类型条件定义\r\ntype AkSupaCondition = {\r\n\tfield : string; // 已经 encodeURIComponent 过\r\n\top : string;\r\n\tvalue : any;\r\n\tlogic : string; // 'and' | 'or'\r\n};\r\n\r\nexport class AkSupaQueryBuilder {\r\n\tprivate _supa : AkSupa;\r\n\tprivate _table : string;\r\n\tprivate _filter : UTSJSONObject | null = null;\r\n\tprivate _options : AkSupaSelectOptions = {};\r\n\tprivate _values : UTSJSONObject | Array | null = null;\r\n\tprivate _single : boolean = false;\r\n\tprivate _conditions : Array = [];\r\n\tprivate _nextLogic : string = 'and';\r\n\t// 新增:记录当前操作类型\r\n\tprivate _action : 'select' | 'insert' | 'update' | 'delete' | 'rpc' | null = null;\r\n\tprivate _orString : string | null = null; // 新增:支持 or 字符串\r\n\tprivate _rpcFunction : string | null = null;\r\n\tprivate _rpcParams : UTSJSONObject | null = null;\r\n\tprivate _page : number = 1; // 新增:当前页码\r\n\r\n\tconstructor(supa : AkSupa, table : string) {\r\n\t\tthis._supa = supa;\r\n\t\tthis._table = table;\r\n\t}\r\n\r\n\t// 链式条件方法\r\n\teq(field : string, value : any) : AkSupaQueryBuilder { return this._addCond(field, 'eq', value); }\r\n\tneq(field : string, value : any) : AkSupaQueryBuilder { return this._addCond(field, 'neq', value); }\r\n\tgt(field : string, value : any) : AkSupaQueryBuilder { return this._addCond(field, 'gt', value); }\r\n\tgte(field : string, value : any) : AkSupaQueryBuilder { return this._addCond(field, 'gte', value); }\r\n\tlt(field : string, value : any) : AkSupaQueryBuilder { return this._addCond(field, 'lt', value); }\r\n\tlte(field : string, value : any) : AkSupaQueryBuilder { return this._addCond(field, 'lte', value); }\r\n\tlike(field : string, value : any) : AkSupaQueryBuilder { return this._addCond(field, 'like', value); }\r\n\tilike(field : string, value : any) : AkSupaQueryBuilder { return this._addCond(field, 'ilike', value); }\r\n\tin(field : string, value : any[]) : AkSupaQueryBuilder { return this._addCond(field, 'in', value); }\r\n\tis(field : string, value : any | null) : AkSupaQueryBuilder { return this._addCond(field, 'is', value); }\r\n\tcontains(field : string, value : any) : AkSupaQueryBuilder { return this._addCond(field, 'cs', value); }\r\n\tcontainedBy(field : string, value : any) : AkSupaQueryBuilder { return this._addCond(field, 'cd', value); }\r\n\tnot(field : string, opOrValue : any, value: any | null = null) : AkSupaQueryBuilder {\r\n\t\tif (value != null) {\r\n\t\t\t// 三元形式:field, operator, value\r\n\t\t\t// 例如 not('badge', 'is', null) -> badge=not.is.null\r\n\t\t\tconst combinedOp = 'not.' + opOrValue;\r\n\t\t\t// 将 null 转换为字符串 'null',避免构造对象时缺少 value 属性\r\n\t\t\tlet safeValue = value;\r\n\t\t\tif (value === null) {\r\n\t\t\t\tsafeValue = 'null';\r\n\t\t\t}\r\n\t\t\treturn this._addCond(field, combinedOp, safeValue);\r\n\t\t} else {\r\n\t\t\t// 二元形式:field, value\r\n\t\t\tlet safeValue = opOrValue;\r\n\t\t\tif (opOrValue === null) {\r\n\t\t\t\tsafeValue = 'null';\r\n\t\t\t}\r\n\t\t\treturn this._addCond(field, 'not', safeValue);\r\n\t\t}\r\n\t}\r\n\r\n\tand() : AkSupaQueryBuilder { this._nextLogic = 'and'; return this; }\r\n\tor(str ?: string) : AkSupaQueryBuilder {\r\n\t\tif (typeof str == 'string') {\r\n\t\t\tthis._orString = str;\r\n\t\t} else {\r\n\t\t\tthis._nextLogic = 'or';\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\tprivate _addCond(afield : string, op : string, value : any | null) : AkSupaQueryBuilder {\r\n\t\t//__f__('log','at components/supadb/aksupa.uts:117','add cond:', op, afield, value)\r\n\t\tconst field = encodeURIComponent(afield)!!\r\n\t\t// 将值安全存储,避免安卓端类型转换问题\r\n\t\tlet safeValue: any | null = value;\r\n\t\tif (value === null) {\r\n\t\t\tsafeValue = 'null';\r\n\t\t} else if (Array.isArray(value)) {\r\n\t\t\t// 数组类型保持原样,用于 in 操作符\r\n\t\t\tsafeValue = value;\r\n\t\t} else if (typeof value === 'number') {\r\n\t\t\t// 数字类型保持原样\r\n\t\t\tsafeValue = value;\r\n\t\t} else if (typeof value === 'boolean') {\r\n\t\t\t// 布尔类型保持原样\r\n\t\t\tsafeValue = value;\r\n\t\t} else if (typeof value !== 'string') {\r\n\t\t\t// 其他类型尝试转换为字符串\r\n\t\t\ttry {\r\n\t\t\t\tsafeValue = value.toString();\r\n\t\t\t} catch (e) {\r\n\t\t\t\tsafeValue = '';\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis._conditions.push({ field, op, value: safeValue ?? '', logic: this._nextLogic });\r\n\t\t//__f__('log','at components/supadb/aksupa.uts:141',this._conditions)\r\n\t\tthis._nextLogic = 'and';\r\n\t\treturn this;\r\n\t}\r\n\r\n\t// 支持原有 where 方式\r\n\twhere(filter : UTSJSONObject) : AkSupaQueryBuilder {\r\n\t\tthis._filter = filter;\r\n\t\treturn this;\r\n\t}\r\n\r\n\tpage(page : number) : AkSupaQueryBuilder {\r\n\t\tthis._page = page;\r\n\t\t// 如果已设置 limit,则自动设置 range\r\n\t\tlet limit = 0;\r\n\t\tif (typeof this._options.limit == 'number') {\r\n\t\t\tlimit = this._options.limit ?? 0;\r\n\t\t}\r\n\t\tif (limit > 0) {\r\n\t\t\tconst from = (page - 1) * limit;\r\n\t\t\tconst to = from + limit - 1;\r\n\t\t\tthis.range(from, to);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\tlimit(limit : number) : AkSupaQueryBuilder {\r\n\t\tthis._options.limit = limit;\r\n\t\t// 总是为 limit 设置对应的 range,确保限制生效\r\n\t\tconst from = (this._page - 1) * limit;\r\n\t\tconst to = from + limit - 1;\r\n\t\tthis.range(from, to);\r\n\t\treturn this;\r\n\t}\r\n\r\n\torder(order : string, options ?: OrderOptions) : AkSupaQueryBuilder {\r\n\t\tif (options != null && options.ascending == false) {\r\n\t\t\tthis._options.order = order + '.desc';\r\n\t\t} else {\r\n\t\t\tthis._options.order = order + '.asc';\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\tcolumns(columns : string) : AkSupaQueryBuilder {\r\n\t\tthis._options.columns = columns;\r\n\t\treturn this;\r\n\t}\r\n\r\n\t// 新增:专门的 count 方法\r\n\tcount(option : CountOption = 'exact') : AkSupaQueryBuilder {\r\n\t\tthis._options.count = option;\r\n\t\tthis._options.head = true; // count 操作默认使用 head 模式\r\n\t\treturn this;\r\n\t}\r\n\r\n\t// 新增:便捷的 count 方法\r\n\tcountExact() : AkSupaQueryBuilder {\r\n\t\treturn this.count('exact');\r\n\t}\r\n\r\n\tcountEstimated() : AkSupaQueryBuilder {\r\n\t\treturn this.count('estimated');\r\n\t}\r\n\r\n\tcountPlanned() : AkSupaQueryBuilder {\r\n\t\treturn this.count('planned');\r\n\t}\r\n\r\n\t// 新增:head 模式方法\r\n\thead(enable : boolean = true) : AkSupaQueryBuilder {\r\n\t\tthis._options.head = enable;\r\n\t\treturn this;\r\n\t}\r\n\r\n\tvalues(values : UTSJSONObject) : AkSupaQueryBuilder {\r\n\t\tthis._values = values;\r\n\t\treturn this;\r\n\t}\r\n\tsingle() : AkSupaQueryBuilder {\r\n\t\tthis._single = true;\r\n\t\treturn this;\r\n\t}\r\n\trange(from : number, to : number) : AkSupaQueryBuilder {\r\n\t\tthis._options.rangeFrom = from;\r\n\t\tthis._options.rangeTo = to;\r\n\t\t//__f__('log','at components/supadb/aksupa.uts:225','设置 range:', from, 'to', to);\r\n\t\treturn this;\r\n\t}\r\n\r\n\t// 辅助函数:安全地将值转换为字符串\r\n\tprivate _valToStr(val: any): string {\r\n\t\tif (val == null) return '';\r\n\t\ttry {\r\n\t\t\t// 尝试直接调用 toString\r\n\t\t\treturn val.toString();\r\n\t\t} catch (e) {\r\n\t\t\ttry {\r\n\t\t\t\t// 尝试 JSON 序列化\r\n\t\t\t\treturn JSON.stringify(val);\r\n\t\t\t} catch (e2) {\r\n\t\t\t\treturn '';\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// 将 _conditions 强类型直接转换为 Supabase/PostgREST 查询字符串(不再用 UTSJSONObject 做中转)\r\n\tprivate _buildFilter() : string | null {\r\n\t\tif (this._conditions.length == 0 && (this._orString==null || this._orString == \"\")) {\r\n\t\t\t// 兼容 where(filter) 方式\r\n\t\t\tif (this._filter == null) return null;\r\n\t\t\t// 兼容旧的 UTSJSONObject filter\r\n\t\t\treturn buildSupabaseFilterQuery(this._filter);\r\n\t\t}\r\n\r\n\t\t// 先分组 and/or,全部用 AkSupaCondition 强类型\r\n\t\tconst ands: AkSupaCondition[] = [];\r\n\t\tconst ors: AkSupaCondition[] = [];\r\n\t\tfor (const c of this._conditions) {\r\n\t\t\tif (c.logic == \"or\") {\r\n\t\t\t\tors.push(c);\r\n\t\t\t} else {\r\n\t\t\t\tands.push(c);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst params: string[] = [];\r\n\t\t// 处理 and 条件\r\n\t\tfor (const cond of ands) {\r\n\t\t\tconst k = cond.field;\r\n\t\t\tconst op = cond.op;\r\n\t\t\tconst val = cond.value;\r\n\t\t\tif ((op == 'in' || op == 'not.in') && Array.isArray(val)) {\r\n\t\t\t\tparams.push(`${k}=${op}.(${val.map(x => this._valToStr(x)).map(x => encodeURIComponent(x)).join(',')})`);\r\n\t\t\t} else if ((op == 'is' || op == 'not.is') && (val == null || val == 'null')) {\r\n\t\t\t\tparams.push(`${k}=${op}.null`);\r\n\t\t\t} else if (op == 'like' || op == 'ilike') {\r\n\t\t\t\tparams.push(`${k}=${op}.${this._valToStr(val)}`);\r\n\t\t\t} else {\r\n\t\t\t\tparams.push(`${k}=${op}.${encodeURIComponent(this._valToStr(val))}`);\r\n\t\t\t}\r\n\t\t}\r\n\t\t// 处理 or 条件\r\n\t\tif (ors.length > 0) {\r\n\t\t\tconst orStr = ors.map(o => {\r\n\t\t\t\tconst k = o.field;\r\n\t\t\t\tconst op = o.op;\r\n\t\t\t\tconst val = o.value;\r\n\t\t\t\tif (op == \"in\" && Array.isArray(val)) {\r\n\t\t\t\t\treturn `${k}.in.(${val.map(x => encodeURIComponent(this._valToStr(x))).join(\",\")})`;\r\n\t\t\t\t}\r\n\t\t\t\tif (op == \"is\" && (val == null)) {\r\n\t\t\t\t\treturn `${k}.is.null`;\r\n\t\t\t\t}\r\n\t\t\t\tif (op == \"like\" || op == \"ilike\") {\r\n\t\t\t\t\treturn `${k}.${op}.${this._valToStr(val)}`;\r\n\t\t\t\t}\r\n\t\t\t\treturn `${k}.${op}.${encodeURIComponent(this._valToStr(val))}`;\r\n\t\t\t}).join(\",\");\r\n\t\t\tparams.push(`or=(${orStr})`);\r\n\t\t}\r\n\t\tif (this._orString!=null && this._orString !== \"\") {\r\n\t\t\t__f__('log','at components/supadb/aksupa.uts:301','[AkSupaQueryBuilder] or字符串:', this._orString)\r\n\t\t\tparams.push(`or=(${this._orString!!})`);\r\n\t\t}\r\n\t\treturn params.length > 0 ? params.join('&') : null;\r\n\t}\r\n\r\n\tselect(columns : string = \"*\", opt : UTSJSONObject | null = null) : AkSupaQueryBuilder {\r\n\t\tthis._action = 'select';\r\n\t\tif (columns != null) {\r\n\t\t\tthis._options.columns = columns;\r\n\t\t}\r\n\t\tif (opt != null) {\r\n\t\t\t// 合并 opt 到 this._options\r\n\t\t\tObject.assign(this._options, opt);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\tinsert(values : UTSJSONObject | Array) : AkSupaQueryBuilder {\r\n\t\tthis._action = 'insert';\r\n\t\t// 检查是否为空\r\n\t\tif (Array.isArray(values)) {\r\n\t\t\tif (values.length == 0) throw toUniError('No values set for insert', 'Insert操作缺少数据');\r\n\t\t} else {\r\n\t\t\tif (UTSJSONObject.keys(values).length == 0) throw toUniError('No values set for insert', 'Insert操作缺少数据');\r\n\t\t}\r\n\t\tthis._values = values;\r\n\t\treturn this;\r\n\t}\r\n\tupdate(values : UTSJSONObject) : AkSupaQueryBuilder {\r\n\t\tthis._action = 'update';\r\n\t\t//__f__('log','at components/supadb/aksupa.uts:331','ak update', this._action)\r\n\t\tif (UTSJSONObject.keys(values).length == 0) throw toUniError('No values set for update', '更新操作缺少数据');\r\n\t\tthis._values = values;\r\n\t\t//__f__('log','at components/supadb/aksupa.uts:334','ak update', values)\r\n\t\treturn this;\r\n\t}\r\n\tdelete() : AkSupaQueryBuilder {\r\n\t\tthis._action = 'delete';\r\n\t\t//__f__('log','at components/supadb/aksupa.uts:339','delete action now')\r\n\t\tconst filter = this._buildFilter();\r\n\t\t//__f__('log','at components/supadb/aksupa.uts:341',filter)\r\n\t\tif (filter == null) throw toUniError('No filter set for delete', '删除操作缺少筛选条件');\r\n\t\t//__f__('log','at components/supadb/aksupa.uts:343','delete action')\r\n\t\treturn this;\r\n\t}\r\n\r\n\trpc(functionName : string, params ?: UTSJSONObject) : AkSupaQueryBuilder {\r\n\t\tthis._action = 'rpc';\r\n\t\tthis._rpcFunction = functionName;\r\n\t\tthis._rpcParams = params;\r\n\t\treturn this;\r\n\t}\r\n\t// 链式请求最终执行方法 - 返回 UTSJSONObject\r\n\tasync execute() : Promise> {\r\n\t\t//__f__('log','at components/supadb/aksupa.uts:355','execute')\r\n\t\tconst filter = this._buildFilter();\r\n\t\t__f__('log','at components/supadb/aksupa.uts:357','[AkSupaQueryBuilder] execute - 表:', this._table, 'filter:', filter)\r\n\t\tlet res : any;\r\n\t\tswitch (this._action) {\r\n\t\t\tcase 'select': {\r\n\t\t\t\t// 传递 single 状态到 options\r\n\t\t\t\tif (this._single) {\r\n\t\t\t\t\tthis._options.single = true;\r\n\t\t\t\t\t// 如果是 single 请求,自动设置 limit 为 1\r\n\t\t\t\t\tif (this._options.limit == null) {\r\n\t\t\t\t\t\tthis._options.limit = 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t//__f__('log','at components/supadb/aksupa.uts:368',this._options)\r\n\t\t\t\t}\t\t\t\t// 保证分页统计\r\n\t\t\t\tif (this._options.limit != null) {\r\n\t\t\t\t\tif (this._options.getcount == null && this._options.count == null) {\r\n\t\t\t\t\t\tthis._options.count = 'exact'; // 优先使用新的 count 选项\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tres = await this._supa.select(this._table, filter, this._options);\r\n\t\t\t\t// 解析 content-range header\r\n\t\t\t\tlet total = 0;\r\n\t\t\t\tlet hasmore = false;\r\n\t\t\t\tconst page = this._page;\r\n\t\t\t\tlet resdata = res.data\r\n\t\t\t\tlet limit = 0;\r\n\t\t\t\tif (typeof this._options.limit == 'number') {\r\n\t\t\t\t\tlimit = this._options.limit ?? 0;\r\n\t\t\t\t} else if (Array.isArray(resdata)) {\r\n\t\t\t\t\tlimit = resdata.length;\r\n\t\t\t\t}\r\n\t\t\t\tlet contentRange : string | null = null;\r\n\t\t\t\tif (res.headers != null) {\r\n\t\t\t\t\tlet theheader = res.headers as UTSJSONObject\r\n\t\t\t\t\tif (typeof theheader.get == 'function') {\r\n\r\n\t\t\t\t\t\tcontentRange = theheader.get('content-range') as string | null;\r\n\t\t\t\t\t} else if (typeof theheader['content-range'] == 'string') {\r\n\t\t\t\t\t\tcontentRange = theheader['content-range'] as string;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (contentRange != null) {\r\n\t\t\t\t\tconst match = /\\/(\\d+)$/.exec(contentRange);\r\n\t\t\t\t\tif (match != null) {\r\n\t\t\t\t\t\ttotal = parseInt(match[1] ?? \"0\");\r\n\t\t\t\t\t\thasmore = (page * limit) < total;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (total == 0) {\r\n\t\t\t\t\t// 使用 JSON 序列化访问 res 对象\r\n\t\t\t\t\tconst resStr = JSON.stringify(res)\r\n\t\t\t\t\tconst resParsed = JSON.parse(resStr)\r\n\t\t\t\t\tif (resParsed != null) {\r\n\t\t\t\t\t\tconst resObj = resParsed as UTSJSONObject\r\n\t\t\t\t\t\tconst countVal = resObj.getNumber('count')\r\n\t\t\t\t\t\tif (countVal != null) {\r\n\t\t\t\t\t\t\ttotal = countVal\r\n\t\t\t\t\t\t} else if (Array.isArray(resdata)) {\r\n\t\t\t\t\t\t\ttotal = resdata.length\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\ttotal = 0\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else if (Array.isArray(resdata)) {\r\n\t\t\t\t\t\ttotal = resdata.length\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\ttotal = 0\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (!hasmore) hasmore = (page * limit) < total;\t\t\t\t// 如果是 head 模式,只返回 count 信息\r\n\t\t\t\tif (this._options.head == true) {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tdata: null, // head 模式不返回数据\r\n\t\t\t\t\t\ttotal,\r\n\t\t\t\t\t\tpage,\r\n\t\t\t\t\t\tlimit,\r\n\t\t\t\t\t\thasmore: false, // head 模式不需要分页信息\r\n\t\t\t\t\t\torigin: res,\r\n\t\t\t\t\t\tstatus: res.status,\r\n\t\t\t\t\t\theaders: res.headers,\r\n\t\t\t\t\t\terror: res.error\r\n\t\t\t\t\t} as AkReqResponse;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn {\r\n\t\t\t\t\tdata: res.data,\r\n\t\t\t\t\ttotal,\r\n\t\t\t\t\tpage,\r\n\t\t\t\t\tlimit,\r\n\t\t\t\t\thasmore,\r\n\t\t\t\t\torigin: res,\r\n\t\t\t\t\tstatus: res.status,\r\n\t\t\t\t\theaders: res.headers,\r\n\t\t\t\t\terror: res.error\r\n\t\t\t\t} as AkReqResponse;\r\n\t\t\t}\r\n\t\t\tcase 'insert': {\r\n\t\t\t\tconst insertValues = this._values;\r\n\t\t\t\tif (insertValues == null) throw toUniError('No values set for insert', '插入操作缺少数据');\r\n\t\t\t\tres = await this._supa.insert(this._table, insertValues);\r\n\t\t\t\tbreak;\r\n\t\t\t} case 'update': {\r\n\t\t\t\tconst updateValues = this._values;\r\n\t\t\t\tif (updateValues == null) throw toUniError('No values set for update', '更新操作缺少数据');\r\n\t\t\t\tif (filter == null) throw toUniError('No filter set for update', '更新操作缺少筛选条件');\r\n\t\t\t\t// Update操作只支持单个对象,不支持数组\r\n\t\t\t\tif (Array.isArray(updateValues)) throw toUniError('Update does not support array values', '更新操作不支持数组数据');\r\n\t\t\t\tres = await this._supa.update(this._table, filter, updateValues as UTSJSONObject);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tcase 'delete': {\r\n\t\t\t\tif (filter == null) throw toUniError('No filter set for delete', '删除操作缺少筛选条件');\r\n\t\t\t\tres = await this._supa.delete(this._table, filter);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tcase 'rpc': {\r\n\t\t\t\tif (this._rpcFunction == null) throw toUniError('No RPC function specified', 'RPC调用缺少函数名');\r\n\t\t\t\tres = await this._supa.rpc(this._rpcFunction as string, this._rpcParams);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tdefault: {\r\n\t\t\t\tres = await this._supa.select(this._table, filter, this._options);\r\n\t\t\t}\r\n\t\t}\r\n\t\t// 保证 data 字段存在(不能赋null,赋空对象或空字符串)\r\n\t\tif (res[\"data\"] == null) res[\"data\"] = {};\r\n\t\treturn res;\r\n\t}\t// 新增:支持类型转换的执行方法\r\n\tasync executeAs() : Promise> {\r\n\t\tconst result = await this.execute();\r\n\r\n\t\tif (result.data == null) {\r\n\t\t\treturn result as AkReqResponse;\r\n\t\t}\r\n\r\n\t\tlet convertedData : any | null = null;\r\n\r\n\t\ttry {\r\n\t\t\tif (Array.isArray(result.data)) {\r\n\t\t\t\tconst dataArray = result.data;\r\n\t\t\t\tconst convertedArray : Array = [];\r\n\t\t\t\tfor (let i = 0; i < dataArray.length; i++) {\r\n\t\t\t\t\tconst item = dataArray[i];\r\n\t\t\t\t\tif (item instanceof UTSJSONObject) {\r\n\r\n\t\t\t\t\t\tconst parsed = item.parse();\r\n\r\n\r\n\r\n\r\n\t\t\t\t\t\tif (parsed != null) {\r\n\t\t\t\t\t\t\tconvertedArray.push(parsed);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t__f__('warn','at components/supadb/aksupa.uts:508','转换失败,使用原始对象:', item);\r\n\t\t\t\t\t\t\tconvertedArray.push(item);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tconst jsonObj = new UTSJSONObject(item);\r\n\r\n\t\t\t\t\t\tconst parsed = jsonObj.parse();\r\n\r\n\r\n\r\n\r\n\t\t\t\t\t\tif (parsed != null) {\r\n\t\t\t\t\t\t\tconvertedArray.push(parsed);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t__f__('warn','at components/supadb/aksupa.uts:523','转换失败,使用原始对象:', item);\r\n\t\t\t\t\t\t\tconvertedArray.push(item);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tconvertedData = convertedArray;\r\n\r\n\t\t\t} else {\r\n\t\t\t\tconst convertedArray : Array = [];\r\n\t\t\t\tif (result.data instanceof UTSJSONObject) {\r\n\t\t\t\t\tconst parsed = result.data.parse();\r\n\r\n\t\t\t\t\tif (parsed != null) {\r\n\t\t\t\t\t\tconvertedArray.push(parsed);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\t//__f__('log','at components/supadb/aksupa.uts:539','转换失败:', result.data)\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconst jsonObj = new UTSJSONObject(result.data);\r\n\t\t\t\t\tconst parsed = jsonObj.parse();\r\n\t\t\t\t\tif (parsed != null) {\r\n\t\t\t\t\t\tconvertedArray.push(parsed);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\t//__f__('log','at components/supadb/aksupa.uts:548','转换失败:', result.data)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tconvertedData = convertedArray;\r\n\t\t\t}\r\n\t\t} catch (e) {\r\n\t\t\t__f__('warn','at components/supadb/aksupa.uts:554','数据类型转换失败,使用原始数据:', e);\r\n\t\t\t__f__('log','at components/supadb/aksupa.uts:555',result.data)\r\n\t\t\tconvertedData = result.data as any;\r\n\t\t}\r\n\t\tresult.data = convertedData\r\n\t\treturn result as AkReqResponse;\r\n\r\n\t}\r\n}\r\n\r\n// 新增:链式 Storage 上传\r\nexport class AkSupaStorageUploadBuilder {\r\n\tprivate _supa : AkSupa;\r\n\tprivate _bucket : string = '';\r\n\tprivate _path : string = '';\r\n private _file : string = '';\r\n\tprivate _options : UTSJSONObject = {};\r\n\r\n\tconstructor(supa : AkSupa, bucket : string) {\r\n\t\tthis._supa = supa;\r\n\t\tthis._bucket = bucket;\r\n\t}\r\n\r\n\tpath(path : string) : AkSupaStorageUploadBuilder {\r\n\t\tthis._path = path;\r\n\t\treturn this;\r\n\t}\r\n\r\n file(file : string) : AkSupaStorageUploadBuilder {\r\n\t\tthis._file = file;\r\n\t\treturn this;\r\n\t}\r\n\r\n\toptions(options : UTSJSONObject) : AkSupaStorageUploadBuilder {\r\n\t\tthis._options = options;\r\n\t\treturn this;\r\n\t}\r\n\tasync upload() : Promise> {\r\n if (this._bucket == '' || this._path == '' || this._file == '') {\r\n\t\t\tthrow toUniError('bucket, path, file are required', '上传文件缺少必要参数');\r\n\t\t}\r\n\t\tconst url = `${this._supa.baseUrl}/storage/v1/object/${this._bucket}/${this._path}`;\r\n\t\tconst apikey = this._supa.apikey;\r\n\t\t// 适配 uni.uploadFile\r\n\t\tconst uploadOptions : AkReqUploadOptions = {\r\n\t\t\turl,\r\n\t\t\tfilePath: this._file, // 这里假设 file 是本地路径\r\n\t\t\tname: 'file', // 默认字段名\r\n\t\t\theaders: {},\r\n\t\t\tapikey,\r\n\t\t\tformData: this._options\r\n\t\t};\r\n\t\treturn await AkReq.upload(uploadOptions);\r\n\t}\r\n}\r\n\r\n// 新增:明确的 StorageBucket 类,支持链式 upload\r\nclass AkSupaStorageBucket {\r\n\tprivate supa : AkSupa;\r\n\tprivate bucket : string;\r\n\tconstructor(supa : AkSupa, bucket : string) {\r\n\t\tthis.supa = supa;\r\n\t\tthis.bucket = bucket;\r\n\t}\r\n\tasync upload(path : string, filePath : string, options ?: UTSJSONObject) : Promise> {\r\n\t\tconst url = `${this.supa.baseUrl}/storage/v1/object/${this.bucket}/${path}`;\r\n\t\tlet headers : UTSJSONObject = { apikey: this.supa.apikey };\r\n\t\tconst formData : UTSJSONObject = {};\r\n\t\tif (options != null && typeof options == 'object') {\r\n\t\t\tif (typeof options.get == 'function' && options.get('x-upsert') != null) {\r\n\t\t\t\theaders['x-upsert'] = options.get('x-upsert');\r\n\t\t\t}\r\n\t\t\tconst keys = UTSJSONObject.keys(options);\r\n\t\t\tfor (let i = 0; i < keys.length; i++) {\r\n\t\t\t\tconst k = keys[i];\r\n\t\t\t\tif (k != 'x-upsert') formData[k] = options.get(k);\r\n\t\t\t}\r\n\t\t}\r\n\t\tconst token = AkReq.getToken();\r\n\t\tif (token != null && !(token == '')) {\r\n\t\t\theaders['Authorization'] = `Bearer ${token}`;\r\n\t\t}\r\n\t\treturn await AkReq.upload({\r\n\t\t\turl,\r\n\t\t\tfilePath,\r\n\t\t\tname: 'file',\r\n\t\t\tapikey: this.supa.apikey,\r\n\t\t\tformData,\r\n\t\t\theaders\r\n\t\t});\r\n\t}\r\n}\r\n\r\nexport class AkSupaStorageApi {\r\n\tprivate _supa : AkSupa;\r\n\tconstructor(supa : AkSupa) {\r\n\t\tthis._supa = supa;\r\n\t}\r\n\tfrom(bucket : string) : AkSupaStorageBucket {\r\n\t\treturn new AkSupaStorageBucket(this._supa, bucket);\r\n\t}\r\n}\r\n\r\nexport class AkSupa {\r\n\tbaseUrl : string;\r\n\tapikey : string;\r\n\tsession : AkSupaSignInResult | null = null;\r\n\tuser : UTSJSONObject | null = null;\r\n\tstorage : AkSupaStorageApi;\r\n\r\n\tconstructor(baseUrl : string, apikey : string) {\r\n\t\tthis.baseUrl = baseUrl;\r\n\t\tthis.apikey = apikey;\r\n\t\tthis.storage = new AkSupaStorageApi(this);\r\n\t\t// [CHANGE][2026-01-30] hydrate user/session from persisted token (see docs: components/supadb/docs/CHANGELOG.md)\r\n\t\ttry {\r\n\t\t\tthis.hydrateSessionFromStorage();\r\n\t\t} catch (e) {\r\n\t\t\t// ignore\r\n\t\t}\r\n\t}\r\n\r\n\t// [CHANGE][2026-01-30] hydrate user from /auth/v1/user when token exists in storage\r\n\tasync hydrateSessionFromStorage() : Promise {\r\n\t\ttry {\r\n\t\t\tconst token = AkReq.getToken();\r\n\t\t\tif (token == null || token == '') return false;\r\n\t\t\tconst res = await AkReq.request({\r\n\t\t\t\turl: this.baseUrl + '/auth/v1/user',\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\theaders: {\r\n\t\t\t\t\tapikey: this.apikey,\r\n\t\t\t\t\tAuthorization: `Bearer ${token}`,\r\n\t\t\t\t\t'Content-Type': 'application/json'\r\n\t\t\t\t} as UTSJSONObject\r\n\t\t\t}, false);\r\n\t\t\tconst status = res.status ?? 0;\r\n\t\t\tif (!(status >= 200 && status < 400)) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tlet user: UTSJSONObject | null = null;\r\n\t\t\ttry {\r\n\t\t\t\tuser = new UTSJSONObject(res.data);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tuser = null;\r\n\t\t\t}\r\n\t\t\tif (user == null) return false;\r\n\t\t\tthis.user = user;\r\n\t\t\t// 仅补齐最小 session 结构,供 getSession / UI 判断登录态使用\r\n\t\t\tif (this.session == null) {\r\n\t\t\t\tthis.session = {\r\n\t\t\t\t\taccess_token: token,\r\n\t\t\t\t\trefresh_token: AkReq.getRefreshToken() ?? '',\r\n\t\t\t\t\texpires_at: AkReq.getExpiresAt() ?? 0,\r\n\t\t\t\t\tuser: user,\r\n\t\t\t\t\ttoken_type: 'bearer',\r\n\t\t\t\t\texpires_in: 0,\r\n\t\t\t\t\traw: user\r\n\t\t\t\t} as AkSupaSignInResult;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t} catch (e) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\tasync resetPassword(email : string) : Promise {\r\n\t\tconst res = await AkReq.request({\r\n\t\t\turl: this.baseUrl + '/auth/v1/recover',\r\n\t\t\tmethod: 'POST',\r\n\t\t\theaders: {\r\n\t\t\t\tapikey: this.apikey,\r\n\t\t\t\t'Content-Type': 'application/json'\r\n\t\t\t} as UTSJSONObject,\r\n\t\t\tdata: { email } as UTSJSONObject,\r\n\t\t\tcontentType: 'application/json'\r\n\t\t}, false);\r\n\r\n\t\t// Supabase returns 200 when the reset email is sent successfully\r\n\t\treturn res.status == 200;\r\n\t}\r\n\tasync signOut() {\r\n\t\tthis.session = null\r\n\t\tthis.user = null\r\n\t}\r\n\tasync signIn(email : string, password : string) : Promise {\r\n\t\t// 提前检查 apikey 配置是否为占位符,避免发送无效请求导致 401\r\n\t\tif (this.apikey == null || this.apikey.trim() === '' || this.apikey === 'your-anon-key') {\r\n\t\t\tthrow new Error('Supabase 配置错误:请在 ak/config.uts 中设置 SUPA_KEY(当前为占位符)');\r\n\t\t}\r\n\t\tconst headers = new UTSJSONObject()\r\n\t\theaders.set('apikey', this.apikey)\r\n\t\theaders.set('Content-Type', 'application/json')\r\n\t\tconst reqData = new UTSJSONObject()\r\n\t\treqData.set('email', email)\r\n\t\treqData.set('password', password)\r\n\t\tconst res = await AkReq.request({\r\n\t\t\turl: this.baseUrl + '/auth/v1/token?grant_type=password',\r\n\t\t\tmethod: 'POST',\r\n\t\t\theaders: headers,\r\n\t\t\tdata: reqData,\r\n\t\t\tcontentType: 'application/json'\r\n\t\t}, false);\r\n\t\t// 如果响应不是 2xx(例如 401),提取后端错误信息并抛出,便于上层显示具体原因\r\n\t\tconst status = res.status ?? 0;\r\n\t\tif (!(status >= 200 && status < 400)) {\r\n\t\t\tlet msg = 'user.login.login_failed';\r\n\t\t\ttry {\r\n\t\t\t\tif (res.data != null) {\r\n\t\t\t\t\tconst obj = new UTSJSONObject(res.data);\r\n\t\t\t\t\tconst rawMsg = obj.getString('message') ?? obj.getString('error') ?? obj.getString('msg') ?? obj.getString('description') ?? obj.getString('error_description') ?? '';\r\n\t\t\t\t\t\r\n\t\t\t\t\t// 核心修复:在这里拦截英文错误并转换为中文\r\n\t\t\t\t\tif (rawMsg.includes('Invalid login credentials')) {\r\n\t\t\t\t\t\tmsg = '用户名或密码错误';\r\n\t\t\t\t\t} else if (rawMsg != '') {\r\n\t\t\t\t\t\tmsg = rawMsg;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} catch (e) {\r\n\t\t\t\t// ignore\r\n\t\t\t}\r\n\t\t\tthrow new Error(msg);\r\n\t\t}\r\n\t\t// 解析成功的返回体\r\n\t\tlet data: UTSJSONObject;\r\n\t\ttry {\r\n\t\t\tdata = new UTSJSONObject(res.data);\r\n\t\t} catch (e) {\r\n\t\t\tdata = new UTSJSONObject({});\r\n\t\t}\r\n\t\tconst access_token = data.getString('access_token') ?? '';\r\n\t\tconst refresh_token = data.getString('refresh_token') ?? '';\r\n\t\tconst expires_at = data.getNumber('expires_at') ?? 0;\r\n\t\tconst user = data.getJSON('user');\r\n\t\tAkReq.setToken(access_token, refresh_token, expires_at);\r\n\t\tconst session : AkSupaSignInResult = {\r\n\t\t\taccess_token: access_token,\r\n\t\t\trefresh_token: refresh_token,\r\n\t\t\texpires_at: expires_at,\r\n\t\t\tuser: user,\r\n\t\t\ttoken_type: data.getString('token_type') ?? '',\r\n\t\t\texpires_in: data.getNumber('expires_in') ?? 0,\r\n\t\t\traw: data\r\n\t\t};\r\n\t\tthis.session = session;\r\n\t\tthis.user = user;\r\n\t\treturn session;\r\n\t}\r\n\r\n\t/**\r\n\t * 获取当前 session 和 user\r\n\t */\r\n\tgetSession() : AkSupaSessionInfo {\r\n\t\treturn {\r\n\t\t\tsession: this.session,\r\n\t\t\tuser: this.user\r\n\t\t};\r\n\t}\r\n\r\n\tasync signUp(email : string, password : string, options : UTSJSONObject | null = null) : Promise {\r\n\t\tconst headers = new UTSJSONObject()\r\n\t\theaders.set('apikey', this.apikey)\r\n\t\theaders.set('Content-Type', 'application/json')\r\n\t\tconst data = new UTSJSONObject()\r\n\t\tdata.set('email', email)\r\n\t\tdata.set('password', password)\r\n\t\t\r\n\t\tif (options != null) {\r\n\t\t\tconst dataField = options.getJSON('data')\r\n\t\t\tif (dataField != null) {\r\n\t\t\t\tdata.set('data', dataField)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst res = await AkReq.request({\r\n\t\t\turl: this.baseUrl + '/auth/v1/signup',\r\n\t\t\tmethod: 'POST',\r\n\t\t\theaders: headers,\r\n\t\t\tdata: data,\r\n\t\t\tcontentType: 'application/json'\r\n\t\t}, false);\r\n\t\treturn res.data as UTSJSONObject;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * 查询表数据(GET方式,支持多条件、limit等,filter自动转为supabase风格query)\r\n\t * filter 支持:\r\n\t * { usr_id: { lt: 800 }, name: { ilike: '%foo%' }, status: 'active', age: { gte: 18, lte: 30 } }\r\n\t * 操作符支持 eq, neq, lt, lte, gt, gte, like, ilike, in, is, not, contains, containedBy, range, fts, plfts, phfts, wfts\r\n\t */\r\nasync select(table : string, filter ?: string | null, options ?: AkSupaSelectOptions) : Promise> {\r\n\tlet url = this.baseUrl + '/rest/v1/' + table;\r\n\tlet headers = new UTSJSONObject()\r\n\theaders.set('apikey', this.apikey)\r\n\theaders.set('Content-Type', 'application/json')\r\n\theaders.set('Authorization', `Bearer ${AkReq.getToken() ?? ''}`)\r\n\tlet params : string[] = [];\r\n\tif (options != null) {\r\n\t\tif (options.columns != null && !(options.columns == \"\")) params.push('select=' + encodeURIComponent(options.columns ?? \"\"));\r\n\t\tif (options.limit != null) {\r\n\t\t\tparams.push('limit=' + options.limit);\r\n\t\t\t//__f__('log','at components/supadb/aksupa.uts:857','设置 limit 参数:', options.limit);\r\n\t\t}\r\n\t\tif (options.order != null && !(options.order == \"\")) params.push('order=' + encodeURIComponent(options.order ?? \"\"));\r\n\t\tif (options.rangeFrom != null && options.rangeTo != null) {\r\n\t\t\theaders['Range'] = `${options.rangeFrom}-${options.rangeTo}`;\r\n\t\t\theaders['Range-Unit'] = 'items';\r\n\t\t\t//__f__('log','at components/supadb/aksupa.uts:863','设置 Range 头部:', `${options.rangeFrom}-${options.rangeTo}`);\r\n\t\t}\r\n\r\n\t\t// 向后兼容:支持旧的 getcount 参数\r\n\t\tlet countOption = options.count ?? options.getcount;\r\n\t\tif (countOption != null) {\r\n\t\t\theaders['Prefer'] = `count=${countOption}`;\r\n\t\t}\r\n\t\t// 新增:head 模式支持\r\n\t\tif (options.head == true) {\r\n\t\t\t//__f__('log','at components/supadb/aksupa.uts:873','使用 head 模式,只返回元数据');\r\n\t\t\t// HEAD 请求用于只获取 count,不返回数据\r\n\t\t\tif (headers['Prefer'] != null) {\r\n\t\t\t\theaders['Prefer'] = (headers['Prefer'] as string) + ',return=minimal';\r\n\t\t\t} else {\r\n\t\t\t\theaders['Prefer'] = 'return=minimal';\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (options.single == true) {\r\n\t\t\t//__f__('log','at components/supadb/aksupa.uts:883','使用 single() 模式');\r\n\t\t\tif (headers['Prefer'] != null) {\r\n\t\t\t\theaders['Prefer'] = (headers['Prefer'] as string) + ',return=representation,single-object';\r\n\t\t\t} else {\r\n\t\t\t\theaders['Prefer'] = 'return=representation,single-object';\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// 确保有 select 参数\r\n\t\tif (options.columns == null) {\r\n\t\t\tparams.push('select=*');\r\n\t\t} else if (options.columns == \"\") {\r\n\t\t\tparams.push('select=*');\r\n\t\t}\r\n\t} else {\r\n\t\tparams.push('select=*');\r\n\t}\r\n\t// 直接用 string filter\r\n\tif (filter!=null && filter !== \"\") {\r\n\t\tparams.push(filter!!);\r\n\t}\r\n\tif (params.length > 0) {\r\n\t\turl += '?' + params.join('&');\r\n\t}\r\n\r\n\t//__f__('log','at components/supadb/aksupa.uts:908',url)\r\n\r\n\t// 确定HTTP方法:如果是head模式,使用HEAD方法\r\n\tlet httpMethod: 'GET' | 'HEAD' = 'GET';\r\n\tif (options != null && options.head == true) {\r\n\t\thttpMethod = 'HEAD';\r\n\t\t//__f__('log','at components/supadb/aksupa.uts:914','使用 HEAD 方法进行 count 查询');\r\n\t}\r\n\r\n\tlet reqOptions : AkReqOptions = {\r\n\t\turl,\r\n\t\tmethod: httpMethod,\r\n\t\theaders\r\n\t};\r\n\treturn await this.requestWithAutoRefresh(reqOptions);\r\n}\r\n\r\nasync select_uts(table : string, filter ?: UTSJSONObject | null, options ?: AkSupaSelectOptions) : Promise> {\r\n\tconst filter_str = buildSupabaseFilterQuery(filter)\r\n\treturn this.select(table,filter_str,options)\r\n}\r\n\t/**\r\n\t * 插入表数据\r\n\t * @param table 表名\r\n\t * @param row 插入对象\r\n\t * @returns 插入结果\r\n\t */\r\n\tasync insert(table : string, row : UTSJSONObject | Array) : Promise> {\r\n\t\tconst url = this.baseUrl + '/rest/v1/' + table;\r\n\t\tconst headers = new UTSJSONObject()\r\n\t\theaders.set('apikey', this.apikey)\r\n\t\theaders.set('Content-Type', 'application/json')\r\n\t\theaders.set('Authorization', `Bearer ${AkReq.getToken() ?? ''}`)\r\n\t\theaders.set('Prefer', 'return=representation')\r\n\r\n\t\tlet reqOptions : AkReqOptions = {\r\n\t\t\turl,\r\n\t\t\tmethod: 'POST',\r\n\t\t\theaders,\r\n\t\t\tdata: row,\r\n\t\t\tcontentType: 'application/json'\r\n\t\t};\r\n\t\treturn await this.requestWithAutoRefresh(reqOptions);\r\n\t}\r\n\r\n\t/**\r\n\t * 更新表数据\r\n\t * @param table 表名\r\n\t * @param filter 过滤条件对象\r\n\t * @param values 更新内容对象\r\n\t * @returns 更新结果\r\n\t */\r\nasync update(table : string, filter : string | null, values : UTSJSONObject) : Promise> {\r\n\tlet url = this.baseUrl + '/rest/v1/' + table;\r\n\tif (filter!=null && filter !== \"\") {\r\n\t\turl += '?' + filter;\r\n\t}\r\n\tconst headers = new UTSJSONObject()\r\n\theaders.set('apikey', this.apikey)\r\n\theaders.set('Content-Type', 'application/json')\r\n\theaders.set('Authorization', `Bearer ${AkReq.getToken() ?? ''}`)\r\n\theaders.set('Prefer', 'return=representation')\r\n\tlet reqOptions : AkReqOptions = {\r\n\t\turl,\r\n\t\tmethod: 'PATCH',\r\n\t\theaders,\r\n\t\tdata: values,\r\n\t\tcontentType: 'application/json'\r\n\t};\r\n\treturn await this.requestWithAutoRefresh(reqOptions);\r\n}\r\n\r\n\t/**\r\n\t * 删除表数据\r\n\t * @param table 表名\r\n\t * @param filter 过滤条件对象\r\n\t * @returns 删除结果\r\n\t */\r\nasync delete(table : string, filter : string | null) : Promise> {\r\n\tlet url = this.baseUrl + '/rest/v1/' + table;\r\n\tif (filter!=null && filter !== \"\") {\r\n\t\turl += '?' + filter;\r\n\t}\r\n\tconst headers = new UTSJSONObject()\r\n\theaders.set('apikey', this.apikey)\r\n\theaders.set('Content-Type', 'application/json')\r\n\theaders.set('Authorization', `Bearer ${AkReq.getToken() ?? ''}`)\r\n\theaders.set('Prefer', 'return=representation')\r\n\tlet reqOptions : AkReqOptions = {\r\n\t\turl,\r\n\t\tmethod: 'DELETE',\r\n\t\theaders,\r\n\t\tcontentType: 'application/json'\r\n\t};\r\n\treturn await this.requestWithAutoRefresh(reqOptions);\r\n}\r\n\r\n\t/**\r\n\t * 调用 Supabase/PostgREST RPC (function)\r\n\t * @param functionName 函数名\r\n\t * @param params 参数对象\r\n\t * @returns AkReqResponse\r\n\t */\r\n\tasync rpc(functionName : string, params ?: UTSJSONObject) : Promise> {\r\n\t\tconst url = this.baseUrl + '/rest/v1/rpc/' + functionName;\r\n\t\tconst headers = new UTSJSONObject()\r\n\t\theaders.set('apikey', this.apikey)\r\n\t\theaders.set('Content-Type', 'application/json')\r\n\t\theaders.set('Authorization', `Bearer ${AkReq.getToken() ?? ''}`)\r\n\t\tlet reqOptions : AkReqOptions = {\r\n\t\t\turl,\r\n\t\t\tmethod: 'POST',\r\n\t\t\theaders,\r\n\t\t\tdata: params ?? new UTSJSONObject(),\r\n\t\t\tcontentType: 'application/json'\r\n\t\t};\r\n\t\treturn await this.requestWithAutoRefresh(reqOptions);\r\n\t}\r\n\t/**\r\n\t * 兼容 supabase-js 风格\r\n\t * @param tableName 表名\r\n\t */\r\n\tfrom(tableName : string) : AkSupaQueryBuilder {\r\n\t\treturn new AkSupaQueryBuilder(this, tableName);\r\n\t}\r\n\r\n /**\r\n * 创建实时订阅通道 (兼容 Supabase Realtime 接口,目前使用轮询模拟)\r\n * @param topic 通道名称,如 public:table\r\n */\r\n channel(topic: string): AkSupaRealtimeChannel {\r\n return new AkSupaRealtimeChannel(this, topic);\r\n }\r\n \r\n /**\r\n * 移除通道\r\n */\r\n removeChannel(channel: AkSupaRealtimeChannel): Promise {\r\n channel.unsubscribe();\r\n return Promise.resolve('ok');\r\n }\r\n\t// AkSupa类内新增:自动刷新session\r\n\tasync refreshSession() : Promise {\r\n\t\tif (this.session == null || this.session?.refresh_token == null) return false;\r\n\t\ttry {\r\n\t\t\tconst headers = new UTSJSONObject()\r\n\t\t\theaders.set('apikey', this.apikey)\r\n\t\t\theaders.set('Content-Type', 'application/json')\r\n\t\t\tconst data = new UTSJSONObject()\r\n\t\t\tdata.set('refresh_token', this.session?.refresh_token)\r\n\t\t\tconst res = await AkReq.request({\r\n\t\t\t\turl: this.baseUrl + '/auth/v1/token?grant_type=refresh_token',\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: headers,\r\n\t\t\t\tdata: data,\r\n\t\t\t\tcontentType: 'application/json'\r\n\t\t\t}, false);\r\n\t\t\tif (res.status == 200 && (res.data != null)) {\r\n\t\t\t\tconst data = res.data as UTSJSONObject;\r\n\t\t\t\tconst access_token = data.getString('access_token') ?? '';\r\n\t\t\t\tconst refresh_token = data.getString('refresh_token') ?? '';\r\n\t\t\t\tconst expires_at = data.getNumber('expires_at') ?? 0;\r\n\t\t\t\tconst user = data.getJSON('user');\r\n\t\t\t\tthis.session = {\r\n\t\t\t\t\taccess_token,\r\n\t\t\t\t\trefresh_token,\r\n\t\t\t\t\texpires_at,\r\n\t\t\t\t\tuser,\r\n\t\t\t\t\ttoken_type: data.getString('token_type') ?? '',\r\n\t\t\t\t\texpires_in: data.getNumber('expires_in') ?? 0,\r\n\t\t\t\t\traw: data\r\n\t\t\t\t};\r\n\t\t\t\tthis.user = user;\r\n\t\t\t\t// 更新本地token\r\n\t\t\t\tAkReq.setToken(access_token, refresh_token, expires_at);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t} catch (e) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\tasync updateUserMetadata(metadata: UTSJSONObject): Promise {\r\n\t\tconst headers = new UTSJSONObject()\r\n\t\theaders.set('apikey', this.apikey)\r\n\t\theaders.set('Content-Type', 'application/json')\r\n\t\theaders.set('Authorization', `Bearer ${AkReq.getToken() ?? ''}`)\r\n\t\tconst data = new UTSJSONObject()\r\n\t\tdata.set('data', metadata)\r\n\t\tconst res = await AkReq.request({\r\n\t\t\turl: this.baseUrl + '/auth/v1/user',\r\n\t\t\tmethod: 'PUT',\r\n\t\t\theaders: headers,\r\n\t\t\tdata: data,\r\n\t\t\tcontentType: 'application/json'\r\n\t\t}, false);\r\n\t\treturn res.data as UTSJSONObject;\r\n\t}\r\n\r\n\t// AkSupa类内新增:自动刷新封装\r\n\tasync requestWithAutoRefresh(reqOptions : AkReqOptions, isRetry = false) : Promise> {\r\n\t\tlet res = await AkReq.request(reqOptions, false);\r\n\t\t// JWT过期:Supabase风格\r\n\t\tconst isJwtExpired = (res.status == 401); //res != null && res.data != null && typeof res.data == 'object' && (res.data as UTSJSONObject)?.getString('code') == 'PGRST301';\r\n\t\t// 401未授权\r\n\t\tconst isUnauthorized = (res.status == 401);\r\n\t\tif ((isJwtExpired || isUnauthorized) && !isRetry) {\r\n\t\t\tconst ok = await this.refreshSession();\r\n\t\t\tif (ok) {\r\n\t\t\t\tlet headers = reqOptions.headers\r\n\t\t\t\tif (headers == null) {\r\n\t\t\t\t\theaders = new UTSJSONObject()\r\n\t\t\t\t}\r\n\t\t\t\tif (typeof headers.set == 'function') {\r\n\t\t\t\t\theaders.set('Authorization', `Bearer ${AkReq.getToken() ?? ''}`)\r\n\t\t\t\t\treqOptions.headers = headers\r\n\t\t\t\t}\r\n\r\n\t\t\t\tres = await AkReq.request(reqOptions, false);\r\n\t\t\t} else {\r\n\t\t\t\tuni.removeStorageSync('user_id');\r\n\t\t\t\tuni.removeStorageSync('token');\r\n\r\n\t\t\t\t//uni.reLaunch({ url: '/pages/user/login' });\r\n __f__('log','at components/supadb/aksupa.uts:1133','登录已过期,请重新登录');\r\n\t\t\t\tthrow toUniError('登录已过期,请重新登录', '用户认证失败');\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn res;\r\n\t}\r\n}\r\n\r\n// 工具函数:将 UTSJSONObject filter 转为 Supabase/PostgREST 查询字符串\r\nfunction buildSupabaseFilterQuery(filter : UTSJSONObject | null) : string {\r\n\t//__f__('log','at components/supadb/aksupa.uts:1143',filter)\r\n\tif (filter == null) return \"\";\r\n\t// 类型保护:如果不是 UTSJSONObject,自动包裹\r\n\tif (typeof filter.get !== 'function') {\r\n\t\ttry {\r\n\t\t\tfilter = new UTSJSONObject(filter as any)\r\n\t\t} catch (e) {\r\n\t\t\t__f__('warn','at components/supadb/aksupa.uts:1150','filter 不是 UTSJSONObject,且无法转换', filter)\r\n\t\t\treturn ''\r\n\t\t}\r\n\t}\r\n\tconst params : string[] = [];\r\n\tconst keys : string[] = UTSJSONObject.keys(filter);\r\n\tfor (let i = 0; i < keys.length; i++) {\r\n\t\tconst k = keys[i];\r\n\t\tconst v = filter.get(k);\r\n\t\tif (k == 'or' && typeof v == 'string') {\r\n\t\t\tparams.push(`or=(${v})`);\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tif (v != null && typeof v == 'object' && typeof (v as UTSJSONObject).get == 'function') {\r\n\t\t\tconst vObj = v as UTSJSONObject;\r\n\t\t\tconst opKeys = UTSJSONObject.keys(vObj);\r\n\t\t\tfor (let j = 0; j < opKeys.length; j++) {\r\n\t\t\t\tconst op = opKeys[j];\r\n\t\t\t\tconst opVal = vObj.get(op);\r\n\t\t\t\tif ((op == 'in' || op == 'not.in') && Array.isArray(opVal)) {\r\n\t\t\t\t\tparams.push(`${k}=${op}.(${opVal.map(x => typeof x == 'object' ? encodeURIComponent(JSON.stringify(x)) : encodeURIComponent(x.toString())).join(',')})`);\r\n\t\t\t\t} else if (op == 'is' && (opVal == null || opVal == 'null')) {\r\n\t\t\t\t\tparams.push(`${k}=is.null`);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconst opvalstr : string = (typeof opVal == 'object') ? JSON.stringify(opVal) : (opVal as string);\r\n\t\t\t\t\tparams.push(`${k}=${op}.${encodeURIComponent(opvalstr)}`);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else if (v != null && typeof v == 'object') {\r\n\t\t\tconst vObj = v as UTSJSONObject;\r\n\t\t\tconst opKeys = UTSJSONObject.keys(vObj);\r\n\t\t\tfor (let j = 0; j < opKeys.length; j++) {\r\n\t\t\t\tconst op = opKeys[j];\r\n\t\t\t\tconst opVal = vObj.get(op);\r\n\t\t\t\tparams.push(`${k}=${op}.${encodeURIComponent(!(opVal == null) ? (typeof opVal == 'object' ? JSON.stringify(opVal) : opVal.toString()) : '')}`);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tparams.push(`${k}=eq.${encodeURIComponent(!(v == null) ? v.toString() : '')}`);\r\n\t\t}\r\n\t}\r\n\treturn params.join('&');\r\n}\r\n\r\n/**\r\n * 创建 Supabase 客户端实例\r\n * @param url 项目 URL\r\n * @param key 项目匿名密钥 (Anon Key)\r\n */\r\nexport function createClient(url : string, key : string) : AkSupa {\r\n\treturn new AkSupa(url, key);\r\n}\r\n\r\n// 模拟 Realtime Channel 类 (Polling Fallback)\r\nexport class AkSupaRealtimeChannel {\r\n private _supa: AkSupa;\r\n private _topic: string;\r\n private _timer: number = 0;\r\n private _callback: ((payload: any) => void) | null = null;\r\n private _table: string = '';\r\n private _lastTime: string = new Date().toISOString(); \r\n private _isSubscribed: boolean = false;\r\n\r\n constructor(supa: AkSupa, topic: string) {\r\n this._supa = supa;\r\n this._topic = topic;\r\n }\r\n\r\n // 绑定事件 (仅支持 postgres_changes INSERT)\r\n on(type: string, filter: UTSJSONObject, callback: (payload: any) => void): AkSupaRealtimeChannel {\r\n // 解析 table\r\n const table = filter.getString('table');\r\n if (table != null) {\r\n this._table = table;\r\n }\r\n this._callback = callback;\r\n return this;\r\n }\r\n\r\n // 开始订阅\r\n subscribe(callback?: (status: string, err: any | null) => void): AkSupaRealtimeChannel {\r\n if (this._isSubscribed) return this;\r\n this._isSubscribed = true;\r\n \r\n // 初始回调\r\n if (callback != null) {\r\n callback('SUBSCRIBED', null);\r\n }\r\n\r\n // 如果没有指定 table,无法轮询\r\n if (this._table == '') {\r\n __f__('warn','at components/supadb/aksupa.uts:1240','Realtime check: No table specified for polling.');\r\n return this;\r\n }\r\n\r\n // 开始轮询 (每3秒)\r\n this._timer = setInterval(() => {\r\n this._checkUpdates();\r\n }, 3000);\r\n\r\n return this;\r\n }\r\n\r\n // 停止订阅\r\n unsubscribe() {\r\n if (this._timer > 0) {\r\n clearInterval(this._timer);\r\n this._timer = 0;\r\n }\r\n this._isSubscribed = false;\r\n }\r\n\r\n // 检查更新\r\n private async _checkUpdates() {\r\n if (!this._isSubscribed || this._table == '') return;\r\n \r\n try {\r\n const now = new Date().toISOString();\r\n \r\n const res = await this._supa\r\n .from(this._table)\r\n .select('*')\r\n .gt('created_at', this._lastTime)\r\n .order('created_at', { ascending: true })\r\n .execute();\r\n \r\n if (res.error == null && res.data != null) {\r\n let list: any[] = [];\r\n if (Array.isArray(res.data)) {\r\n list = res.data as any[];\r\n }\r\n \r\n if (list.length > 0) {\r\n // 更新最后时间\r\n const lastItem = list[list.length - 1];\r\n let lastTimeStr: string | null = null;\r\n \r\n if (lastItem instanceof UTSJSONObject) {\r\n lastTimeStr = lastItem.getString('created_at');\r\n } else {\r\n // 尝试转 json\r\n const j = JSON.parse(JSON.stringify(lastItem)) as UTSJSONObject;\r\n lastTimeStr = j.getString('created_at');\r\n }\r\n \r\n if (lastTimeStr != null) {\r\n this._lastTime = lastTimeStr;\r\n } else {\r\n this._lastTime = now;\r\n }\r\n\r\n // 触发回调\r\n if (this._callback != null) {\r\n // 模拟 Realtime payload\r\n list.forEach(item => {\r\n const payload = {\r\n new: item,\r\n eventType: 'INSERT',\r\n old: null\r\n };\r\n this._callback?.(payload);\r\n });\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n __f__('error','at components/supadb/aksupa.uts:1315','Realtime polling error:', e);\r\n }\r\n }\r\n}\r\n\r\nexport default AkSupa;\r\n","// /components/supadb/aksupainstance.uts\r\nimport { createClient } from './aksupa.uts'\r\nimport { SUPA_URL, SUPA_KEY } from '@/ak/config.uts'\r\n\r\n// 创建单一真实的 Supabase 客户端实例 (使用 config.uts 配置)\r\n// Create single source of truth client using config\r\nconst supaInstance = createClient(SUPA_URL, SUPA_KEY)\r\n\r\n// 导出默认实例 (供 login.uvue 等使用)\r\nexport default supaInstance\r\n\r\n// 导出命名实例 'supabase' (供 store.uts 使用)\r\nexport const supabase = supaInstance\r\n\r\n// 导出 isSupabaseReady 状态\r\nexport const isSupabaseReady = true\r\n\r\n// 兼容 ensureSupabaseReady\r\nexport async function ensureSupabaseReady() {\r\n return true\r\n}\r\n\r\n// 检查连接状态的函数\r\nexport function checkConnection() {\r\n return Promise.resolve(true)\r\n}\r\n\r\n// 兼容 supaReady Promise\r\nexport const supaReady = Promise.resolve(true)\r\n\r\n// 如果有其他需要导出的函数,可以这样导出:\r\nexport function initializeSupabase(url: string, key: string) {\r\n return createClient(url, key)\r\n}\r\n","// 电商商城系统类型定义 - UTS Android 兼容\r\n\r\n// 用户类型\r\nexport type UserType = {\r\n\tid: string\r\n\tphone: string\r\n\temail: string | null\r\n\tnickname: string | null\r\n\tavatar_url: string | null\r\n\tgender: number\r\n\tuser_type: number\r\n\tstatus: number\r\n\tcreated_at: string\r\n}\r\n\r\n// 商城用户扩展信息类型\r\nexport type MallUserProfileType = {\r\n\tid: string\r\n\tuser_id: string\r\n\tuser_type: number\r\n\tstatus: number\r\n\treal_name: string | null\r\n\tid_card: string | null\r\n\tcredit_score: number\r\n\tmall_role: string\r\n\tverification_status: number\r\n\tverification_data: UTSJSONObject | null\r\n\tbusiness_license: string | null\r\n\tshop_category: string | null\r\n\tservice_areas: UTSJSONObject | null\r\n\temergency_contact: string | null\r\n\tpreferences: UTSJSONObject | null\r\n\tcreated_at: string\r\n\tupdated_at: string\r\n}\r\n\r\n// 用户地址类型\r\nexport type UserAddressType = {\r\n\tid: string\r\n\tuser_id: string\r\n\treceiver_name: string\r\n\treceiver_phone: string\r\n\tprovince: string\r\n\tcity: string\r\n\tdistrict: string\r\n\taddress_detail: string\r\n\tpostal_code: string | null\r\n\tis_default: boolean\r\n\tlabel: string | null\r\n\tcoordinates: string | null\r\n\tdelivery_instructions: string | null\r\n\tbusiness_hours: string | null\r\n\tstatus: number\r\n\tcreated_at: string\r\n\tupdated_at: string\r\n}\r\n\r\n// 商家类型\r\nexport type MerchantType = {\r\n\tid: string\r\n\tuser_id: string\r\n\tshop_name: string\r\n\tshop_logo: string | null\r\n\tshop_banner: string | null\r\n\tshop_description: string | null\r\n\tcontact_name: string\r\n\tcontact_phone: string\r\n\tshop_status: number\r\n\trating: number\r\n\ttotal_sales: number\r\n\tcreated_at: string\r\n}\r\n\r\n// 商品类型\r\nexport type ProductType = {\r\n\tid: string\r\n\tmerchant_id: string\r\n\tcategory_id: string\r\n\tname: string\r\n\tdescription: string | null\r\n\timages: Array\r\n\tprice: number\r\n\toriginal_price: number | null\r\n\tstock: number\r\n\tsales: number\r\n\tstatus: number\r\n\tcreated_at: string\r\n\t// 药品相关字段\r\n\tspecification?: string | null // 规格说明\r\n\tusage?: string | null // 用法用量\r\n\tside_effects?: string | null // 副作用\r\n\tprecautions?: string | null // 注意事项\r\n\texpiry_date?: string | null // 有效期\r\n\tstorage_conditions?: string | null // 储存条件\r\n\tapproval_number?: string | null // 批准文号\r\n\ttags?: Array | null // 商品标签\r\n}\r\n\r\n// 商品SKU类型\r\nexport type ProductSkuType = {\r\n\tid: string\r\n\tproduct_id: string\r\n\tsku_code: string\r\n\tspecifications: UTSJSONObject | null\r\n\tprice: number\r\n\tstock: number\r\n\timage_url: string | null\r\n\tstatus: number\r\n}\r\n\r\n// 购物车类型\r\nexport type CartItemType = {\r\n\tid: string\r\n\tuser_id: string\r\n\tproduct_id: string\r\n\tsku_id: string\r\n\tquantity: number\r\n\tselected: boolean\r\n\tproduct: ProductType | null\r\n\tsku: ProductSkuType | null\r\n}\r\n\r\n// 订单类型\r\nexport type OrderType = {\r\n\tid: string\r\n\torder_no: string\r\n\tuser_id: string\r\n\tmerchant_id: string\r\n\tstatus: number\r\n\ttotal_amount: number\r\n\tdiscount_amount: number\r\n\tdelivery_fee: number\r\n\tactual_amount: number\r\n\tpayment_method: number | null\r\n\tpayment_status: number\r\n\tdelivery_address: UTSJSONObject\r\n\tcreated_at: string\r\n}\r\n\r\n// 订单商品类型\r\nexport type OrderItemType = {\r\n\tid: string\r\n\torder_id: string\r\n\tproduct_id: string\r\n\tsku_id: string\r\n\tproduct_name: string\r\n\tsku_specifications: UTSJSONObject | null\r\n\tprice: number\r\n\tquantity: number\r\n\ttotal_amount: number\r\n}\r\n\r\n// 配送员类型\r\nexport type DeliveryDriverType = {\r\n\tid: string\r\n\tuser_id: string\r\n\treal_name: string\r\n\tid_card: string\r\n\tdriver_license: string | null\r\n\tvehicle_type: number\r\n\tvehicle_number: string | null\r\n\twork_status: number\r\n\tcurrent_location: UTSJSONObject | null\r\n\tservice_areas: Array\r\n\trating: number\r\n\ttotal_orders: number\r\n\tauth_status: number\r\n\tcreated_at: string\r\n\tupdated_at: string\r\n}\r\n\r\n// 配送任务类型\r\nexport type DeliveryTaskType = {\r\n\tid: string\r\n\torder_id: string\r\n\tdriver_id: string | null\r\n\tpickup_address: UTSJSONObject\r\n\tdelivery_address: UTSJSONObject\r\n\tdistance: number | null\r\n\testimated_time: number | null\r\n\tdelivery_fee: number\r\n\tstatus: number\r\n\tpickup_time: string | null\r\n\tdelivered_time: string | null\r\n\tdelivery_code: string | null\r\n\tremark: string | null\r\n\tcreated_at: string\r\n\tupdated_at: string\r\n}\r\n\r\n// 优惠券模板类型\r\nexport type CouponTemplateType = {\r\n\tid: string\r\n\tname: string\r\n\tdescription: string | null\r\n\tcoupon_type: number\r\n\tdiscount_type: number\r\n\tdiscount_value: number\r\n\tmin_order_amount: number\r\n\tmax_discount_amount: number | null\r\n\ttotal_quantity: number | null\r\n\tper_user_limit: number\r\n\tusage_limit: number\r\n\tmerchant_id: string | null\r\n\tcategory_ids: Array\r\n\tproduct_ids: Array\r\n\tuser_type_limit: number | null\r\n\tstart_time: string\r\n\tend_time: string\r\n\tstatus: number\r\n\tcreated_at: string\r\n}\r\n\r\n// 用户优惠券类型\r\nexport type UserCouponType = {\r\n\tid: string\r\n\tuser_id: string\r\n\ttemplate_id: string\r\n\tcoupon_code: string\r\n\tstatus: number\r\n\tused_at: string | null\r\n\torder_id: string | null\r\n\treceived_at: string\r\n\texpire_at: string\r\n}\r\n\r\n// 分页数据类型\r\nexport type PageDataType = {\r\n\tdata: Array\r\n\ttotal: number\r\n\tpage: number\r\n\tpageSize: number\r\n\thasMore: boolean\r\n}\r\n\r\n// API响应类型\r\nexport type ApiResponseType = {\r\n\tsuccess: boolean\r\n\tdata: T | null\r\n\tmessage: string\r\n\tcode: number\r\n}\r\n\r\n// 订单状态枚举\r\nexport const ORDER_STATUS = {\r\n\tPENDING_PAYMENT: 1,\r\n\tPAID: 2,\r\n\tSHIPPED: 3,\r\n\tDELIVERED: 4,\r\n\tCOMPLETED: 5,\r\n\tCANCELLED: 6,\r\n\tREFUNDING: 7,\r\n\tREFUNDED: 8\r\n}\r\n\r\n// 优惠券类型枚举\r\nexport const COUPON_TYPE = {\r\n\tDISCOUNT_AMOUNT: 1, // 满减券\r\n\tDISCOUNT_PERCENT: 2, // 折扣券\r\n\tFREE_SHIPPING: 3, // 免运费券\r\n\tNEWBIE: 4, // 新人券\r\n\tMEMBER: 5, // 会员券\r\n\tCATEGORY: 6, // 品类券\r\n\tMERCHANT: 7, // 商家券\r\n\tLIMITED_TIME: 8 // 限时券\r\n}\r\n\r\n// 支付方式枚举\r\nexport const PAYMENT_METHOD = {\r\n\tWECHAT: 1,\r\n\tALIPAY: 2,\r\n\tUNIONPAY: 3,\r\n\tBALANCE: 4\r\n}\r\n\r\n// 配送状态枚举\r\nexport const DELIVERY_STATUS = {\r\n\tPENDING: 1,\r\n\tASSIGNED: 2,\r\n\tPICKED_UP: 3,\r\n\tIN_TRANSIT: 4,\r\n\tDELIVERED: 5,\r\n\tFAILED: 6\r\n}\r\n\r\n// 用户类型枚举\r\nexport const MALL_USER_TYPE = {\r\n\tCONSUMER: 1, // 消费者\r\n\tMERCHANT: 2, // 商家\r\n\tDELIVERY: 3, // 配送员\r\n\tSERVICE: 4, // 客服\r\n\tADMIN: 5 // 管理员\r\n}\r\n\r\n// 用户状态枚举\r\nexport const USER_STATUS = {\r\n\tNORMAL: 1, // 正常\r\n\tFROZEN: 2, // 冻结\r\n\tCANCELLED: 3, // 注销\r\n\tPENDING: 4 // 待审核\r\n} as const\r\n\r\n// 认证状态枚举\r\nexport const VERIFICATION_STATUS = {\r\n\tUNVERIFIED: 0, // 未认证\r\n\tVERIFIED: 1, // 已认证\r\n\tFAILED: 2 // 认证失败\r\n}\r\n\r\n// 地址标签枚举\r\nexport const ADDRESS_LABEL = {\r\n\tHOME: 'home', // 家\r\n\tOFFICE: 'office', // 公司\r\n\tSCHOOL: 'school', // 学校\r\n\tOTHER: 'other' // 其他\r\n}\r\n\r\n// 收藏类型枚举\r\nexport const FAVORITE_TYPE = {\r\n\tPRODUCT: 'product', // 商品\r\n\tSHOP: 'shop' // 店铺\r\n}\r\n\r\n// =========================\r\n// 订阅相关类型与枚举\r\n// =========================\r\n\r\n// 订阅周期枚举\r\nexport const SUBSCRIPTION_PERIOD = {\r\n\tMONTHLY: 'monthly',\r\n\tYEARLY: 'yearly'\r\n}\r\n\r\n// 订阅状态枚举\r\nexport const SUBSCRIPTION_STATUS = {\r\n\tTRIAL: 'trial',\r\n\tACTIVE: 'active',\r\n\tPAST_DUE: 'past_due',\r\n\tCANCELED: 'canceled',\r\n\tEXPIRED: 'expired'\r\n}\r\n\r\n// 软件订阅方案类型\r\nexport type SubscriptionPlanType = {\r\n\tid: string\r\n\tplan_code: string\r\n\tname: string\r\n\tdescription: string | null\r\n\tfeatures: UTSJSONObject | null // { featureKey: description }\r\n\tprice: number // 单位:元(或分,取决于后端;前端以显示为准)\r\n\tcurrency: string | null // 'CNY' | 'USD' ...\r\n\tbilling_period: string // 'monthly' | 'yearly'\r\n\ttrial_days: number | null\r\n\tis_active: boolean\r\n\tsort_order?: number | null\r\n\tcreated_at?: string\r\n\tupdated_at?: string\r\n}\r\n\r\n// 用户订阅记录类型\r\nexport type UserSubscriptionType = {\r\n\tid: string\r\n\tuser_id: string\r\n\tplan_id: string\r\n\tstatus: string\r\n\tstart_date: string\r\n\tend_date: string | null\r\n\tnext_billing_date: string | null\r\n\tauto_renew: boolean\r\n\tcancel_at_period_end?: boolean | null\r\n\tmetadata?: UTSJSONObject | null\r\n\tcreated_at?: string\r\n\tupdated_at?: string\r\n}\r\n\r\n// 用户基础信息类型 (兼容 pages/user/types.uts)\r\nexport type UserProfile = {\r\n id?: string;\r\n username: string;\r\n email: string;\r\n gender?: string;\r\n birthday?: string;\r\n height_cm?: number;\r\n weight_kg?: number;\r\n bio?: string;\r\n avatar_url?: string;\r\n preferred_language?: string;\r\n role?: string;\r\n school_id?: string;\r\n grade_id?: string;\r\n class_id?: string;\r\n created_at?: string;\r\n updated_at?: string;\r\n}\r\n\r\nexport type UserStats = {\r\n trainings: number;\r\n points: number;\r\n streak: number;\r\n}\r\n\r\n// 足迹项类型\r\nexport type FootprintItemType = {\r\n id: string\r\n name: string\r\n price: number\r\n original_price: number | null\r\n image: string\r\n sales: number\r\n shopId: string\r\n shopName: string\r\n viewTime: number\r\n}\r\n\r\n// =========================\r\n// 积分相关类型\r\n// =========================\r\n\r\n// 签到记录类型\r\nexport type SigninRecordType = {\r\n id: string\r\n user_id: string\r\n signin_date: string\r\n points_earned: number\r\n bonus_points: number\r\n continuous_days: number\r\n created_at: string\r\n}\r\n\r\n// 签到结果类型\r\nexport type SigninResultType = {\r\n success: boolean\r\n points: number\r\n continuous_days: number\r\n bonus_points: number\r\n total_points: number\r\n message: string\r\n}\r\n\r\n// 积分兑换商品类型\r\nexport type PointProductType = {\r\n id: string\r\n name: string\r\n description: string | null\r\n image_url: string | null\r\n product_type: string\r\n points_required: number\r\n original_price: number | null\r\n stock: number\r\n status: number\r\n sort_order: number\r\n created_at: string\r\n}\r\n\r\n// 积分兑换记录类型\r\nexport type PointExchangeType = {\r\n id: string\r\n user_id: string\r\n product_id: string\r\n quantity: number\r\n points_used: number\r\n status: number\r\n tracking_no: string | null\r\n address_snapshot: UTSJSONObject | null\r\n created_at: string\r\n product: PointProductType | null\r\n}\r\n\r\n// 积分规则类型\r\nexport type PointRuleType = {\r\n id: string\r\n rule_type: string\r\n rule_name: string\r\n points: number\r\n description: string | null\r\n config: UTSJSONObject | null\r\n status: number\r\n}\r\n\r\n// 积分概览类型\r\nexport type PointsOverviewType = {\r\n current_points: number\r\n total_earned: number\r\n total_used: number\r\n expiring_points: number\r\n expiring_date: string | null\r\n}\r\n\r\n// =========================\r\n// 评价相关类型\r\n// =========================\r\n\r\n// 商品评价类型(扩展)\r\nexport type ProductReviewType = {\r\n id: string\r\n user_id: string\r\n product_id: string\r\n order_id: string\r\n order_item_id: string | null\r\n rating: number\r\n content: string | null\r\n images: string[]\r\n videos: string[]\r\n tags: string[]\r\n is_anonymous: boolean\r\n like_count: number\r\n is_edited: boolean\r\n append_content: string | null\r\n append_at: string | null\r\n append_images: string[]\r\n reply: string | null\r\n reply_time: string | null\r\n created_at: string\r\n updated_at: string\r\n user_name: string | null\r\n user_avatar: string | null\r\n is_liked: boolean\r\n}\r\n\r\n// 评价统计类型\r\nexport type ReviewStatsType = {\r\n total_count: number\r\n avg_rating: number\r\n good_rate: number\r\n rating_distribution: Map\r\n tags: ReviewTagType[]\r\n}\r\n\r\n// 评价标签类型\r\nexport type ReviewTagType = {\r\n name: string\r\n count: number\r\n}\r\n\r\n// 评价点赞类型\r\nexport type ReviewLikeType = {\r\n id: string\r\n review_id: string\r\n user_id: string\r\n created_at: string\r\n}\r\n\r\n// 评价举报类型\r\nexport type ReviewReportType = {\r\n id: string\r\n review_id: string\r\n user_id: string\r\n reason: string\r\n description: string | null\r\n status: number\r\n handle_result: string | null\r\n created_at: string\r\n}\r\n\r\n// 配送员评价类型\r\nexport type DeliveryRatingType = {\r\n id: string\r\n order_id: string\r\n delivery_user_id: string\r\n user_id: string\r\n rating: number\r\n content: string | null\r\n created_at: string\r\n}\r\n\r\n// 我的评价列表项类型\r\nexport type MyReviewItemType = {\r\n id: string\r\n product_id: string\r\n product_name: string\r\n product_image: string\r\n rating: number\r\n content: string | null\r\n images: string[]\r\n created_at: string\r\n can_append: boolean\r\n can_edit: boolean\r\n}\r\n\r\n// =========================\r\n// 推销模式相关类型\r\n// =========================\r\n\r\n// 用户余额类型\r\nexport type UserBalanceType = {\r\n id: string\r\n user_id: string\r\n balance: number\r\n frozen_balance: number\r\n total_earned: number\r\n total_withdrawn: number\r\n updated_at: string\r\n}\r\n\r\n// 余额变动记录类型\r\nexport type BalanceRecordType = {\r\n id: string\r\n user_id: string\r\n type: string\r\n amount: number\r\n balance_before: number\r\n balance_after: number\r\n related_id: string | null\r\n description: string | null\r\n operator_id: string | null\r\n created_at: string\r\n}\r\n\r\n// 分享记录类型\r\nexport type ShareRecordType = {\r\n id: string\r\n user_id: string\r\n product_id: string\r\n order_id: string\r\n order_item_id: string | null\r\n share_code: string\r\n product_name: string\r\n product_image: string | null\r\n product_price: number\r\n required_count: number\r\n current_count: number\r\n status: number\r\n reward_amount: number | null\r\n created_at: string\r\n completed_at: string | null\r\n expired_at: string | null\r\n}\r\n\r\n// 二级购买记录类型\r\nexport type SecondaryPurchaseType = {\r\n id: string\r\n share_record_id: string\r\n buyer_id: string\r\n order_id: string\r\n quantity: number\r\n unit_price: number\r\n created_at: string\r\n}\r\n\r\n// 免单奖励记录类型\r\nexport type FreeOrderRewardType = {\r\n id: string\r\n user_id: string\r\n share_record_id: string\r\n amount: number\r\n status: number\r\n balance_record_id: string | null\r\n cleared_at: string | null\r\n cleared_by: string | null\r\n created_at: string\r\n}\r\n\r\n// 会员等级类型\r\nexport type MemberLevelType = {\r\n id: number\r\n name: string\r\n min_amount: number\r\n discount: number\r\n icon: string | null\r\n description: string | null\r\n sort_order: number\r\n status: number\r\n}\r\n\r\n// 用户会员信息类型\r\nexport type UserMemberInfoType = {\r\n member_level: number\r\n level_name: string\r\n discount: number\r\n total_spent: number\r\n next_level: MemberLevelType | null\r\n progress_percent: number\r\n manual_level: boolean\r\n}\r\n\r\n// 会员等级变更记录类型\r\nexport type MemberLevelLogType = {\r\n id: string\r\n user_id: string\r\n old_level: number\r\n new_level: number\r\n reason: string | null\r\n operator_id: string | null\r\n created_at: string\r\n}\r\n","// 设备信息类型\r\nexport type DeviceInfo = {\r\n\tid: string\r\n\tdevice_name?: string\r\n\tstatus?: string // 'online' | 'offline' | 其他状态\r\n\tuser_id?: string\r\n\t// 可根据实际需求添加更多字段\r\n}\r\n\r\n// 设备查询参数类型\r\nexport type DeviceParams = {\r\n\tuser_id: string\r\n\t// 可根据实际需求添加更多查询参数\r\n}\r\n","import supabase, { supaReady } from '@/components/supadb/aksupainstance.uts'\r\nimport type { UserProfile } from '@/types/mall-types.uts'\r\n\r\n/**\r\n * 确保用户资料存在,如果不存在则创建基础资料\r\n * @param sessionUser 会话用户对象 (UTSJSONObject)\r\n * @returns 创建的用户资料,如果创建失败则返回 null\r\n */\r\nexport async function ensureUserProfile(sessionUser: UTSJSONObject): Promise {\r\n\ttry {\r\n\t\tawait supaReady\r\n \r\n\t\t// 从 sessionUser 中获取用户ID和邮箱\r\n\t\tconst userId = sessionUser.getString('id')\r\n\t\tconst email = sessionUser.getString('email') ?? ''\r\n\t\t\r\n\t\tif (userId == null || userId === '') {\r\n\t\t\t__f__('error','at utils/sapi.uts:18','无法获取用户ID')\r\n\t\t\treturn null\r\n\t\t}\r\n\t\t\r\n\t\t// 检查用户是否已存在(ak_users 通过 id 或 auth_id 关联 auth.users.id)\r\n\t\tconst checkRes = await supabase.from('ak_users')\r\n\t\t\t.select('*', {})\r\n\t\t\t.or('id.eq.' + userId + ',auth_id.eq.' + userId)\r\n\t\t\t.execute()\r\n\t\t\r\n\t\t__f__('log','at utils/sapi.uts:28','ensureUserProfile check ak_users:', {\r\n\t\t\tstatus: checkRes.status,\r\n\t\t\thasData: checkRes.data != null\r\n\t\t})\r\n\t\t\r\n\t\tconst dataList = checkRes.data\r\n\t\tif (checkRes.status >= 200 && checkRes.status < 300 && dataList != null && (dataList as any[]).length > 0) {\r\n\t\t\t// 用户已存在,返回现有资料(H5 下 checkRes.data 可能是 plain object,不一定是 UTSJSONObject)\r\n\t\t\tlet existingUser: UTSJSONObject\r\n\t\t\tconst firstItem = (dataList as any[])[0]\r\n\t\t\tif (firstItem instanceof UTSJSONObject) {\r\n\t\t\t\texistingUser = firstItem\r\n\t\t\t} else {\r\n\t\t\t\texistingUser = new UTSJSONObject(firstItem)\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tconst currentRole = existingUser.getString('role')\r\n\t\t\tconst currentAuthId = existingUser.getString('auth_id')\r\n\t\t\t\r\n\t\t\t// 【强力修复逻辑】如果 role 是 student 或者 auth_id 为空,进行 upsert 修复\r\n\t\t\tif (currentRole == 'student' || currentAuthId == null || currentAuthId == '') {\r\n\t\t\t\t__f__('log','at utils/sapi.uts:49','检测到旧数据异常,正在修复角色或关联ID...')\r\n\t\t\t\tconst updateData = new UTSJSONObject()\r\n\t\t\t\t// updateData.set('id', userId) // update 场景不需要传 ID 在 body 里,通常作为 filter\r\n\t\t\t\tupdateData.set('auth_id', userId)\r\n\t\t\t\tupdateData.set('role', 'consumer')\r\n\t\t\t\t\r\n\t\t\t\tawait supabase.from('ak_users')\r\n\t\t\t\t.update(updateData)\r\n\t\t\t\t.eq('id', userId)\r\n\t\t\t\t.execute()\r\n\t\t\t\t\r\n\t\t\t\t// 同步 Auth 元数据\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst meta = new UTSJSONObject()\r\n\t\t\t\t\tmeta.set('user_role', 'consumer')\r\n\t\t\t\t\tawait supabase.updateUserMetadata(meta)\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\t__f__('warn','at utils/sapi.uts:66','同步 Auth 元数据失败:', e)\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t// 返回修复后的对象\r\n\t\t\t\treturn {\r\n\t\t\t\t\tid: userId,\r\n\t\t\t\t\tusername: existingUser.getString('username') ?? email.split('@')[0],\r\n\t\t\t\t\temail: existingUser.getString('email') ?? email,\r\n\t\t\t\t\trole: 'consumer'\r\n\t\t\t\t} as UserProfile\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\tid: userId, // 始终返回 auth.users.id 作为 Profile ID\r\n\t\t\t\tusername: existingUser.getString('username') ?? '',\r\n\t\t\t\temail: existingUser.getString('email') ?? email,\r\n\t\t\t\tgender: existingUser.getString('gender'),\r\n\t\t\t\tbirthday: existingUser.getString('birthday'),\r\n\t\t\t\theight_cm: existingUser.getNumber('height_cm'),\r\n\t\t\t\tweight_kg: existingUser.getNumber('weight_kg'),\r\n\t\t\t\tbio: existingUser.getString('bio'),\r\n\t\t\t\tavatar_url: existingUser.getString('avatar_url'),\r\n\t\t\t\tpreferred_language: existingUser.getString('preferred_language'),\r\n\t\t\t\trole: existingUser.getString('role') ?? 'consumer',\r\n\t\t\t\tcreated_at: existingUser.getString('created_at'),\r\n\t\t\t\tupdated_at: existingUser.getString('updated_at')\r\n\t\t\t} as UserProfile\r\n\t\t}\r\n\t\t\r\n\t\t// 用户不存在,创建新用户资料\r\n\t\tconst newUserData = new UTSJSONObject()\r\n\t\tnewUserData.set('id', userId)\r\n\t\tnewUserData.set('auth_id', userId) // 确保 auth_id 被存储,解决登录查不到 Profile 的问题\r\n\t\tnewUserData.set('email', email)\r\n\t\tnewUserData.set('username', email.split('@')[0] ?? 'user') // 默认用户名为邮箱前缀\r\n\t\tnewUserData.set('role', 'consumer') // 强制设置为消费者角色\r\n\t\tnewUserData.set('created_at', new Date().toISOString()) // 手动设置创建时间\r\n\t\t\r\n\t\t// 尝试同步更新 Auth 元数据,确保以后登录生成的 JWT 中角色也为 consumer\r\n\t\ttry {\r\n\t\t\tconst meta = new UTSJSONObject()\r\n\t\t\tmeta.set('user_role', 'consumer')\r\n\t\t\tawait supabase.updateUserMetadata(meta)\r\n\t\t} catch (e) {\r\n\t\t\t__f__('warn','at utils/sapi.uts:110','同步 Auth 元数据失败 (非致命):', e)\r\n\t\t}\r\n\r\n\t\t__f__('log','at utils/sapi.uts:113','准备插入 ak_users, 目标 ID:', userId)\r\n\t\t__f__('log','at utils/sapi.uts:114','正在执行 insert 资料:', JSON.stringify(newUserData))\r\n\t\tconst insertRes = await supabase.from('ak_users')\r\n\t\t\t.insert(newUserData)\r\n\t\t\t.select('*', {})\r\n\t\t\t.execute()\r\n\t\t\r\n\t\t__f__('log','at utils/sapi.uts:120','ensureUserProfile insert ak_users 完整结果:', JSON.stringify(insertRes))\r\n\t\t\r\n\t\tif (insertRes.status >= 200 && insertRes.status < 300) {\r\n\t\t\tconst dataList = (insertRes.data != null) ? (insertRes.data as any[]) : []\r\n\t\t\tconst rawData = dataList.length > 0 ? dataList[0] : null\r\n\t\t\t\r\n\t\t\tif (rawData == null) {\r\n\t\t\t\t__f__('log','at utils/sapi.uts:127','ensureUserProfile: 资料插入操作已完成(200),但未返回数据(可能是 RLS 限制)');\r\n\t\t\t\treturn {\r\n\t\t\t\t\tid: userId,\r\n\t\t\t\t\tusername: email.split('@')[0] ?? 'user',\r\n\t\t\t\t\temail: email,\r\n\t\t\t\t\trole: 'consumer',\r\n\t\t\t\t\tcreated_at: newUserData.getString('created_at')\r\n\t\t\t\t} as UserProfile\r\n\t\t\t}\r\n\r\n\t\t\tconst newUser = (rawData instanceof UTSJSONObject)\r\n\t\t\t\t? (rawData as UTSJSONObject)\r\n\t\t\t\t: new UTSJSONObject(rawData)\r\n\t\t\treturn {\r\n\t\t\t\tid: newUser.getString('id') ?? userId,\r\n\t\t\t\tusername: newUser.getString('username') ?? email.split('@')[0],\r\n\t\t\t\temail: newUser.getString('email') ?? email,\r\n\t\t\t\tgender: newUser.getString('gender'),\r\n\t\t\t\tbirthday: newUser.getString('birthday'),\r\n\t\t\t\theight_cm: newUser.getNumber('height_cm'),\r\n\t\t\t\tweight_kg: newUser.getNumber('weight_kg'),\r\n\t\t\t\tbio: newUser.getString('bio'),\r\n\t\t\t\tavatar_url: newUser.getString('avatar_url'),\r\n\t\t\t\tpreferred_language: newUser.getString('preferred_language'),\r\n\t\t\t\trole: newUser.getString('role') ?? 'consumer',\r\n\t\t\t\tcreated_at: newUser.getString('created_at'),\r\n\t\t\t\tupdated_at: newUser.getString('updated_at')\r\n\t\t\t} as UserProfile\r\n\t\t} else {\r\n\t\t\t__f__('error','at utils/sapi.uts:156','创建用户资料失败:', insertRes.status)\r\n\t\t\treturn null\r\n\t\t}\r\n\t} catch (error) {\r\n\t\t__f__('error','at utils/sapi.uts:160','ensureUserProfile 异常:', error)\r\n\t\treturn null\r\n\t}\r\n}\r\n","import supa, { supaReady } from '@/components/supadb/aksupainstance.uts'\r\nimport type { UserProfile, UserStats } from '@/types/mall-types.uts'\r\nimport type { DeviceInfo } from '@/pages/sense/types.uts'\r\nimport { SenseDataService, type DeviceParams } from '@/pages/sense/senseDataService.uts'\r\nimport { reactive } from 'vue'\r\nimport { ensureUserProfile } from './sapi.uts'\r\n\r\n// 设备状态类型\r\nexport type DeviceState = {\r\n\tdevices : Array\r\n\tcurrentDevice : DeviceInfo | null\r\n\tisLoading : boolean\r\n\tlastUpdated : number | null\r\n}\r\n\r\n//定义一个大写的State类型\r\nexport type State = {\r\n\tglobalNum : number\r\n\tuserProfile ?: UserProfile\r\n\tisLoggedIn : boolean // 新增字段\r\n\tdeviceState : DeviceState // 新增设备状态\r\n\t// 如有需要,可增加更多属性\r\n}\r\n\r\n// 实例化为state\r\nexport const state = reactive({\r\n\tglobalNum: 0,\r\n\tuserProfile: { username: '', email: '' },\r\n\tisLoggedIn: false,\r\n\tdeviceState: {\r\n\t\tdevices: [],\r\n\t\tcurrentDevice: null,\r\n\t\tisLoading: false,\r\n\t\tlastUpdated: null\r\n\t} as DeviceState\r\n} as State)\r\n// 定义修改属性值的方法\r\nexport const setGlobalNum = (num : number) => {\r\n\tstate.globalNum = num\r\n}\r\n// 新增:设置登录状态的方法\r\nexport const setIsLoggedIn = (val : boolean) => {\r\n\tstate.isLoggedIn = val\r\n}\r\n// 定义全局设置用户信息的方法\r\nexport const setUserProfile = (profile : UserProfile) => {\r\n\tstate.userProfile = profile\r\n}\r\n\r\n// 获取当前用户信息(含补全 profile)\r\nexport async function getCurrentUser() : Promise {\r\n\ttry {\r\n\t\tawait supaReady\r\n\t} catch (_) {}\r\n\r\n\tconst sessionInfo = supa.getSession()\r\n\tif (sessionInfo.user == null) {\r\n\t\tstate.userProfile = { username: '', email: '' } as UserProfile\r\n\t\tstate.isLoggedIn = false // 未登录\r\n\t\treturn null\r\n\t}\r\n\tconst userId = sessionInfo.user?.getString(\"id\")\r\n\tif (userId == null) {\r\n\t\tstate.userProfile = { username: '', email: '' } as UserProfile\r\n\t\tstate.isLoggedIn = false // 未登录\r\n\t\treturn null\r\n\t}\t// 查询 ak_users 表补全 profile\r\n\tconst res = await supa.from('ak_users').select('*', {}).eq('id', userId).execute()\r\n\t__f__('log','at utils/store.uts:69',res)\r\n\tif (res.status >= 200 && res.status < 300 && (res.data != null)) {\r\n\t\tlet user : UTSJSONObject | null = null;\r\n\t\tconst data = res.data as any;\r\n\t\tif (Array.isArray(data)) {\r\n\t\t\tif (data.length > 0) {\r\n\t\t\t\tuser = data[0] as UTSJSONObject;\r\n\t\t\t}\r\n\t\t} else if (data != null) {\r\n\t\t\tuser = data as UTSJSONObject;\r\n\t\t} __f__('log','at utils/store.uts:79',user)\r\n\t\tif (user == null) {\r\n\t\t\t__f__('log','at utils/store.uts:81','用户资料为空,尝试创建基础资料...')\t\t\t// 如果用户资料为空,尝试创建基础用户资料\r\n\t\t\tconst sessionUser = sessionInfo.user\r\n\t\t\tif (sessionUser != null) {\r\n\t\t\t\tconst createdProfile = await ensureUserProfile(sessionUser)\r\n\t\t\t\tif (createdProfile != null) {\r\n\t\t\t\t\tstate.userProfile = createdProfile\r\n\t\t\t\t\tstate.isLoggedIn = true\r\n\t\t\t\t\treturn createdProfile\r\n\t\t\t\t} else {\r\n\t\t\t\t\t__f__('error','at utils/store.uts:90','创建用户资料失败')\r\n\t\t\t\t\tstate.userProfile = { username: '', email: '' } as UserProfile\r\n\t\t\t\t\tstate.isLoggedIn = false\r\n\t\t\t\t\treturn null\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t__f__('error','at utils/store.uts:96','会话用户信息为空')\r\n\t\t\t\tstate.userProfile = { username: '', email: '' } as UserProfile\r\n\t\t\t\tstate.isLoggedIn = false\r\n\t\t\t\treturn null\r\n\t\t\t}\r\n\t\t}\r\n\t\t__f__('log','at utils/store.uts:102',user)\r\n\t\t// 直接用 getString/getNumber,无需兜底属性\t\t\r\n\t\tconst profile : UserProfile = {\r\n\t\t\tid: user.getString('id'),\r\n\t\t\tusername: user.getString('username') ?? \"\",\r\n\t\t\temail: user.getString('email') ?? \"\",\r\n\t\t\tgender: user.getString('gender'),\r\n\t\t\tbirthday: user.getString('birthday'),\r\n\t\t\theight_cm: user.getNumber('height_cm'),\r\n\t\t\tweight_kg: user.getNumber('weight_kg'),\r\n\t\t\tbio: user.getString('bio'),\r\n\t\t\tavatar_url: user.getString('avatar_url'),\r\n\t\t\tpreferred_language: user.getString('preferred_language'),\r\n\t\t\trole: user.getString('role'),\r\n\t\t\tschool_id: user.getString('school_id'),\r\n\t\t\tgrade_id: user.getString('grade_id'),\r\n\t\t\tclass_id: user.getString('class_id')\r\n\t\t}\r\n\t\tstate.userProfile = profile\r\n\t\tstate.isLoggedIn = true // 登录成功\r\n\t\treturn profile\r\n\t} else {\r\n\t\tstate.userProfile = { username: '', email: '' } as UserProfile\r\n\t\tstate.isLoggedIn = false // 未登录\r\n\t\treturn null\r\n\t}\r\n}\r\n\r\n// 登出并清空用户信息\r\nexport function logout() {\r\n\tsupa.signOut()\r\n\tstate.userProfile = { username: '', email: '' } as UserProfile\r\n\tstate.isLoggedIn = false // 登出\r\n}\r\n\r\n// 获取当前用户ID(优先级:state.userProfile.id > session > localStorage)\r\nexport function getCurrentUserId() : string {\r\n\ttry {\r\n\t\tconst profile = state.userProfile\r\n\t\tif (profile != null && profile.id != null) {\r\n\t\t\tconst profileId = profile.id\r\n\t\t\tif (profileId != null) {\r\n\t\t\t\treturn profileId\r\n\t\t\t}\r\n\t\t}\r\n\t} catch (e) { }\r\n\ttry {\r\n\t\tconst session = supa.getSession()\r\n\t\tif (session != null) {\r\n\t\t\tconst curuser = session.user\r\n\t\t\tconst userId = curuser?.getString('id')\r\n\t\t\tif (userId != null) return userId\r\n\t\t}\r\n\t} catch (e) { }\r\n\treturn ''\r\n}\r\n\r\n// 获取当前用户的class_id\r\nexport function getCurrentUserClassId() : string | null {\r\n\ttry {\r\n\t\tconst profile = state.userProfile\r\n\t\tif (profile != null && profile.class_id != null) {\r\n\t\t\treturn profile.class_id\r\n\t\t}\r\n\t} catch (e) {\r\n\t\t__f__('error','at utils/store.uts:167','获取用户class_id失败:', e)\r\n\t}\r\n\treturn null\r\n}\r\n\r\n// User store API for component compatibility\r\nexport function getUserStore() {\r\n\treturn {\r\n\t\tgetUserId() : string | null {\r\n\t\t\tconst sessionInfo = supa.getSession()\r\n\t\t\treturn sessionInfo.user?.getString(\"id\") ?? null\r\n\t\t},\r\n\r\n\t\tgetUserName() : string | null {\r\n\t\t\treturn state.userProfile?.username ?? null\r\n\t\t},\r\n\r\n\t\tgetUserRole() : string | null {\r\n\t\t\t// Default role logic - can be enhanced based on your needs\r\n\t\t\tconst sessionInfo = supa.getSession()\r\n\t\t\tif (sessionInfo.user == null) return null\r\n\r\n\t\t\t// You can add role detection logic here\r\n\t\t\t// For now, return a default role\r\n\t\t\treturn 'teacher' // or determine from user profile/database\r\n\t\t},\r\n\r\n\t\tgetProfile() : UserProfile | null {\r\n\t\t\treturn state.userProfile\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// ========== 设备状态管理方法 ==========\r\n\r\n/**\r\n * 设置设备加载状态\r\n */\r\nexport const setDeviceLoading = (loading : boolean) => {\r\n\tstate.deviceState.isLoading = loading\r\n}\r\n\r\n/**\r\n * 设置设备列表\r\n */\r\nexport const setDevices = (devices : Array) => {\r\n\tstate.deviceState.devices = devices\r\n\tstate.deviceState.lastUpdated = Date.now()\r\n}\r\n\r\n/**\r\n * 添加设备到列表\r\n */\r\nexport const addDevice = (device : DeviceInfo) => {\r\n\tconst existingIndex = state.deviceState.devices.findIndex(d => d.id === device.id)\r\n\tif (existingIndex >= 0) {\r\n\t\t// 更新现有设备\r\n\t\tstate.deviceState.devices[existingIndex] = device\r\n\t} else {\r\n\t\t// 添加新设备\r\n\t\tstate.deviceState.devices.push(device)\r\n\t}\r\n\tstate.deviceState.lastUpdated = Date.now()\r\n}\r\n\r\n/**\r\n * 从列表中移除设备\r\n */\r\nexport const removeDevice = (deviceId : string) => {\r\n\tconst index = state.deviceState.devices.findIndex(d => d.id === deviceId)\r\n\tif (index >= 0) {\r\n\t\tstate.deviceState.devices.splice(index, 1)\r\n\t\t// 如果移除的是当前设备,清空当前设备\r\n\t\tif (state.deviceState.currentDevice?.id === deviceId) {\r\n\t\t\tstate.deviceState.currentDevice = null\r\n\t\t}\r\n\t\tstate.deviceState.lastUpdated = Date.now()\r\n\t}\r\n}\r\n\r\n/**\r\n * 更新设备信息\r\n */\r\nexport const updateDevice = (device : DeviceInfo) => {\r\n\tconst index = state.deviceState.devices.findIndex(d => d.id === device.id)\r\n\tif (index >= 0) {\r\n\t\tstate.deviceState.devices[index] = device\r\n\t\t// 如果更新的是当前设备,也更新当前设备\r\n\t\tif (state.deviceState.currentDevice?.id === device.id) {\r\n\t\t\tstate.deviceState.currentDevice = device\r\n\t\t}\r\n\t\tstate.deviceState.lastUpdated = Date.now()\r\n\t}\r\n}\r\n\r\n/**\r\n * 设置当前选中的设备\r\n */\r\nexport const setCurrentDevice = (device : DeviceInfo | null) => {\r\n\tstate.deviceState.currentDevice = device\r\n}\r\n\r\n/**\r\n * 根据设备ID获取设备信息\r\n */\r\nexport const getDeviceById = (deviceId : string) : DeviceInfo | null => {\r\n\treturn state.deviceState.devices.find(d => d.id === deviceId) ?? null\r\n}\r\n\r\n/**\r\n * 获取在线设备列表\r\n */\r\nexport const getOnlineDevices = () : Array => {\r\n\treturn state.deviceState.devices.filter(d => d.status === 'online')\r\n}\r\n\r\n/**\r\n * 从服务器加载设备列表\r\n */\r\nexport const loadDevices = async (forceRefresh : boolean) : Promise => {\r\n\tconst userId = getCurrentUserId()\r\n\tif (userId == null || userId === '') {\r\n\t\t__f__('log','at utils/store.uts:289','用户未登录,无法加载设备列表')\r\n\t\treturn false\r\n\t}\r\n\r\n\t// 如果不是强制刷新且数据较新(5分钟内),直接返回\r\n\tconst now = Date.now()\r\n\tconst lastUpdated = state.deviceState.lastUpdated\r\n\tif (forceRefresh == false && lastUpdated != null && (now - lastUpdated < 5 * 60 * 1000)) {\r\n\t\t__f__('log','at utils/store.uts:297','设备数据较新,跳过刷新')\r\n\t\treturn true\r\n\t}\r\n\tsetDeviceLoading(true)\r\n\ttry {\r\n\t\tconst result = await SenseDataService.getDevices({ user_id: userId })\r\n\t\tif (result.error === null && result.data != null) {\r\n\t\t\tconst devices = result.data as Array\r\n\t\t\tsetDevices(devices)\r\n\t\t\t__f__('log','at utils/store.uts:306',`加载设备列表成功,共${devices.length}个设备`)\r\n\t\t\treturn true\r\n\t\t} else {\r\n\t\t\t__f__('log','at utils/store.uts:309','加载设备列表失败:', result.error?.message ?? '未知错误')\r\n\t\t\treturn false\r\n\t\t}\r\n\t} catch (error) {\r\n\t\t__f__('log','at utils/store.uts:313','加载设备列表异常:', error)\r\n\t\treturn false\r\n\t} finally {\r\n\t\tsetDeviceLoading(false)\r\n\t}\r\n}\r\n\r\n/**\r\n * 从服务器加载设备列表 - 带默认参数的重载版本\r\n */\r\nexport const loadDevicesWithDefault = async () : Promise => {\r\n\treturn await loadDevices(false)\r\n}\r\n\r\n/**\r\n * 绑定新设备\r\n */\r\nexport const bindNewDevice = async (deviceData : UTSJSONObject) : Promise => {\r\n\tconst userId = getCurrentUserId()\r\n\tif (userId == null) {\r\n\t\t__f__('log','at utils/store.uts:333','用户未登录,无法绑定设备')\r\n\t\treturn false\r\n\t}\r\n\r\n\t// 确保设备数据中包含用户ID\r\n\tdeviceData.set('user_id', userId)\r\n\ttry {\r\n\t\tconst result = await SenseDataService.bindDevice(deviceData)\r\n\t\tif (result.error === null && result.data != null) {\r\n\t\t\t// 添加到本地状态\r\n\t\t\taddDevice(result.data as DeviceInfo)\r\n\t\t\tconst deviceName = (result.data as DeviceInfo).device_name ?? '未知设备'\r\n\t\t\t__f__('log','at utils/store.uts:345','设备绑定成功:', deviceName)\r\n\t\t\treturn true\r\n\t\t} else {\r\n\t\t\t__f__('log','at utils/store.uts:348','设备绑定失败:', result.error?.message ?? '未知错误')\r\n\t\t\treturn false\r\n\t\t}\r\n\t} catch (error) {\r\n\t\t__f__('log','at utils/store.uts:352','设备绑定异常:', error)\r\n\t\treturn false\r\n\t}\r\n}\r\n\r\n/**\r\n * 解绑设备\r\n */\r\nexport const unbindDevice = async (deviceId : string) : Promise => {\r\n\ttry {\r\n\t\tconst result = await SenseDataService.unbindDevice(deviceId)\r\n\t\tif (result.error === null) {\r\n\t\t\t// 从本地状态中移除\r\n\t\t\tremoveDevice(deviceId)\r\n\t\t\t__f__('log','at utils/store.uts:366','设备解绑成功')\r\n\t\t\treturn true\r\n\t\t} else {\r\n\t\t\t__f__('log','at utils/store.uts:369','设备解绑失败:', result.error?.message ?? '未知错误')\r\n\t\t\treturn false\r\n\t\t}\r\n\t} catch (error) {\r\n\t\t__f__('log','at utils/store.uts:373','设备解绑异常:', error)\r\n\t\treturn false\r\n\t}\r\n}\r\n\r\n/**\r\n * 更新设备配置\r\n */\r\nexport const updateDeviceConfig = async (deviceId : string, configData : UTSJSONObject) : Promise => {\r\n\ttry {\r\n\t\tconst result = await SenseDataService.updateDevice(deviceId, configData)\r\n\t\tif (result.error === null && result.data != null) {\r\n\t\t\t// 更新本地状态\r\n\t\t\tupdateDevice(result.data as DeviceInfo)\r\n\t\t\t__f__('log','at utils/store.uts:387','设备配置更新成功')\r\n\t\t\treturn true\r\n\t\t} else {\r\n\t\t\t__f__('log','at utils/store.uts:390','设备配置更新失败:', result.error?.message ?? '未知错误')\r\n\t\t\treturn false\r\n\t\t}\r\n\t} catch (error) {\r\n\t\t__f__('log','at utils/store.uts:394','设备配置更新异常:', error)\r\n\t\treturn false\r\n\t}\r\n}\r\n\r\n// ========== 设备管理 API ==========\r\n\r\n/**\r\n * 获取设备管理相关的API\r\n */\r\nexport function getDeviceStore() {\r\n\treturn {\r\n\t\t// 获取设备状态\r\n\t\tgetDevices() : Array {\r\n\t\t\treturn state.deviceState.devices\r\n\t\t},\r\n\r\n\t\tgetCurrentDevice() : DeviceInfo | null {\r\n\t\t\treturn state.deviceState.currentDevice\r\n\t\t},\r\n\r\n\t\tisLoading() : boolean {\r\n\t\t\treturn state.deviceState.isLoading\r\n\t\t},\r\n\t\tgetLastUpdated() : number | null {\r\n\t\t\treturn state.deviceState.lastUpdated\r\n\t\t},\r\n\r\n\t\t// 设备操作方法\r\n\t\tasync loadDevices(forceRefresh : boolean) : Promise {\r\n\t\t\treturn await loadDevices(forceRefresh)\r\n\t\t},\r\n\r\n\t\tasync refreshDevices() : Promise {\r\n\t\t\treturn await loadDevicesWithDefault()\r\n\t\t},\r\n\r\n\t\tasync bindDevice(deviceData : UTSJSONObject) : Promise {\r\n\t\t\treturn await bindNewDevice(deviceData)\r\n\t\t},\r\n\r\n\t\tasync unbindDevice(deviceId : string) : Promise {\r\n\t\t\treturn await unbindDevice(deviceId)\r\n\t\t},\r\n\r\n\t\tasync updateDevice(deviceId : string, configData : UTSJSONObject) : Promise {\r\n\t\t\treturn await updateDeviceConfig(deviceId, configData)\r\n\t\t},\r\n\r\n\t\t// 设备查询方法\r\n\t\tgetDeviceById(deviceId : string) : DeviceInfo | null {\r\n\t\t\treturn getDeviceById(deviceId)\r\n\t\t},\r\n\r\n\t\tgetOnlineDevices() : Array {\r\n\t\t\treturn getOnlineDevices()\r\n\t\t},\r\n\r\n\t\t// 设备选择\r\n\t\tsetCurrentDevice(device : DeviceInfo | null) {\r\n\t\t\tsetCurrentDevice(device)\r\n\t\t}\r\n\t}\r\n}","import 'D:/HBuilderX/HBuilderX/plugins/uniapp-cli-vite/node_modules/@dcloudio/uni-console/src/runtime/app/index.ts';// 简化的main.uts,移除i18n依赖\r\nimport { createSSRApp } from 'vue'\r\nimport App from './App.uvue'\r\nimport i18n from '@/uni_modules/i18n/index.uts'\r\n\r\nexport function createApp() {\r\n const app = createSSRApp(App)\r\n \r\n // 注册 i18n 全局属性,使组件可以使用 $t 方法\r\n\tapp.config.globalProperties.$t = (key: string, values?: any, locale?: string): string => {\r\n\t\tif (i18n.global == null) {\r\n\t\t\t__f__('error','at main.uts:12','i18n is not initialized')\r\n\t\t\treturn key\r\n\t\t}\r\n const params = values as UTSJSONObject | null\r\n\t\tconst res = i18n.global.t(key, params, locale)\r\n if (res.length > 0) {\r\n return res\r\n }\r\n return key\r\n\t}\r\n \r\n return { app }\r\n}\r\n\nexport function main(app: IApp) {\n definePageRoutes();\n defineAppConfig();\n (createApp()['app'] as VueApp).mount(app, GenUniApp());\n}\n\nexport class UniAppConfig extends io.dcloud.uniapp.appframe.AppConfig {\n override name: string = \"商城消费者端\"\n override appid: string = \"__UNI__CONSUMER\"\n override versionName: string = \"1.0.0\"\n override versionCode: string = \"100\"\n override uniCompilerVersion: string = \"4.87\"\n \n constructor() { super() }\n}\n\nimport GenPagesUserLoginClass from './pages/user/login.uvue'\nimport GenPagesMainIndexClass from './pages/main/index.uvue'\nimport GenPagesMainCategoryClass from './pages/main/category.uvue'\nimport GenPagesMainCartClass from './pages/main/cart.uvue'\nimport GenPagesMainProfileClass from './pages/main/profile.uvue'\nimport GenPagesMallConsumerSettingsClass from './pages/mall/consumer/settings.uvue'\nimport GenPagesMallConsumerWalletClass from './pages/mall/consumer/wallet.uvue'\nimport GenPagesMallConsumerWithdrawClass from './pages/mall/consumer/withdraw.uvue'\nimport GenPagesMallConsumerSearchClass from './pages/mall/consumer/search.uvue'\nimport GenPagesMallConsumerProductDetailClass from './pages/mall/consumer/product-detail.uvue'\nimport GenPagesMallConsumerShopDetailClass from './pages/mall/consumer/shop-detail.uvue'\nimport GenPagesMallConsumerCouponsClass from './pages/mall/consumer/coupons.uvue'\nimport GenPagesMallConsumerFavoritesClass from './pages/mall/consumer/favorites.uvue'\nimport GenPagesMallConsumerFootprintClass from './pages/mall/consumer/footprint.uvue'\nimport GenPagesMallConsumerAddressListClass from './pages/mall/consumer/address-list.uvue'\nimport GenPagesMallConsumerAddressEditClass from './pages/mall/consumer/address-edit.uvue'\nimport GenPagesMallConsumerCheckoutClass from './pages/mall/consumer/checkout.uvue'\nimport GenPagesMallConsumerPaymentClass from './pages/mall/consumer/payment.uvue'\nimport GenPagesMallConsumerPaymentSuccessClass from './pages/mall/consumer/payment-success.uvue'\nimport GenPagesMallConsumerOrdersClass from './pages/mall/consumer/orders.uvue'\nimport GenPagesMallConsumerOrderDetailClass from './pages/mall/consumer/order-detail.uvue'\nimport GenPagesMallConsumerLogisticsClass from './pages/mall/consumer/logistics.uvue'\nimport GenPagesMallConsumerReviewClass from './pages/mall/consumer/review.uvue'\nimport GenPagesMallConsumerRefundClass from './pages/mall/consumer/refund.uvue'\nimport GenPagesMallConsumerApplyRefundClass from './pages/mall/consumer/apply-refund.uvue'\nimport GenPagesMallConsumerRefundReviewClass from './pages/mall/consumer/refund-review.uvue'\nimport GenPagesMallConsumerChatClass from './pages/mall/consumer/chat.uvue'\nimport GenPagesMallConsumerSubscriptionFollowedShopsClass from './pages/mall/consumer/subscription/followed-shops.uvue'\nimport GenPagesMallConsumerPointsIndexClass from './pages/mall/consumer/points/index.uvue'\nimport GenPagesMallConsumerPointsSigninClass from './pages/mall/consumer/points/signin.uvue'\nimport GenPagesMallConsumerPointsExchangeClass from './pages/mall/consumer/points/exchange.uvue'\nimport GenPagesMallConsumerPointsExchangeRecordsClass from './pages/mall/consumer/points/exchange-records.uvue'\nimport GenPagesMallConsumerProductReviewsClass from './pages/mall/consumer/product-reviews.uvue'\nimport GenPagesMallConsumerMyReviewsClass from './pages/mall/consumer/my-reviews.uvue'\nimport GenPagesMallConsumerBalanceIndexClass from './pages/mall/consumer/balance/index.uvue'\nimport GenPagesMallConsumerShareIndexClass from './pages/mall/consumer/share/index.uvue'\nimport GenPagesMallConsumerShareDetailClass from './pages/mall/consumer/share/detail.uvue'\nimport GenPagesMallConsumerMemberIndexClass from './pages/mall/consumer/member/index.uvue'\nimport GenPagesMallConsumerMessageDetailClass from './pages/mall/consumer/message-detail.uvue'\nimport GenPagesMallConsumerRedPacketsIndexClass from './pages/mall/consumer/red-packets/index.uvue'\nimport GenPagesMallConsumerBankCardsIndexClass from './pages/mall/consumer/bank-cards/index.uvue'\nimport GenPagesMallConsumerBankCardsAddClass from './pages/mall/consumer/bank-cards/add.uvue'\nfunction definePageRoutes() {\n__uniRoutes.push({ path: \"pages/user/login\", component: GenPagesUserLoginClass, meta: { isQuit: true } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"用户登录\"],[\"navigationStyle\",\"custom\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/main/index\", component: GenPagesMainIndexClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"首页\"],[\"navigationStyle\",\"custom\"],[\"enablePullDownRefresh\",false]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/main/category\", component: GenPagesMainCategoryClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"分类\"],[\"navigationStyle\",\"custom\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/main/cart\", component: GenPagesMainCartClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"购物车\"],[\"navigationStyle\",\"custom\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/main/profile\", component: GenPagesMainProfileClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"我的\"],[\"navigationStyle\",\"custom\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/settings\", component: GenPagesMallConsumerSettingsClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"设置\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/wallet\", component: GenPagesMallConsumerWalletClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"我的钱包\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/withdraw\", component: GenPagesMallConsumerWithdrawClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"余额提现\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/search\", component: GenPagesMallConsumerSearchClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"搜索\"],[\"navigationStyle\",\"custom\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/product-detail\", component: GenPagesMallConsumerProductDetailClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"商品详情\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/shop-detail\", component: GenPagesMallConsumerShopDetailClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"店铺详情\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/coupons\", component: GenPagesMallConsumerCouponsClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"我的优惠券\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/favorites\", component: GenPagesMallConsumerFavoritesClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"我的收藏\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/footprint\", component: GenPagesMallConsumerFootprintClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"我的足迹\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/address-list\", component: GenPagesMallConsumerAddressListClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"收货地址\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/address-edit\", component: GenPagesMallConsumerAddressEditClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"编辑地址\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/checkout\", component: GenPagesMallConsumerCheckoutClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"确认订单\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/payment\", component: GenPagesMallConsumerPaymentClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"收银台\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/payment-success\", component: GenPagesMallConsumerPaymentSuccessClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"支付成功\"],[\"navigationStyle\",\"custom\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/orders\", component: GenPagesMallConsumerOrdersClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"我的订单\"],[\"enablePullDownRefresh\",true]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/order-detail\", component: GenPagesMallConsumerOrderDetailClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"订单详情\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/logistics\", component: GenPagesMallConsumerLogisticsClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"物流详情\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/review\", component: GenPagesMallConsumerReviewClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"评价晒单\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/refund\", component: GenPagesMallConsumerRefundClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"退款/售后\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/apply-refund\", component: GenPagesMallConsumerApplyRefundClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"申请售后\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/refund-review\", component: GenPagesMallConsumerRefundReviewClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"服务评价\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/chat\", component: GenPagesMallConsumerChatClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"客服聊天\"],[\"navigationStyle\",\"custom\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/subscription/followed-shops\", component: GenPagesMallConsumerSubscriptionFollowedShopsClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"关注店铺\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/points/index\", component: GenPagesMallConsumerPointsIndexClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"积分管理\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/points/signin\", component: GenPagesMallConsumerPointsSigninClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"每日签到\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/points/exchange\", component: GenPagesMallConsumerPointsExchangeClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"积分兑换\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/points/exchange-records\", component: GenPagesMallConsumerPointsExchangeRecordsClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"兑换记录\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/product-reviews\", component: GenPagesMallConsumerProductReviewsClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"商品评价\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/my-reviews\", component: GenPagesMallConsumerMyReviewsClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"我的评价\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/balance/index\", component: GenPagesMallConsumerBalanceIndexClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"我的余额\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/share/index\", component: GenPagesMallConsumerShareIndexClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"我的分享\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/share/detail\", component: GenPagesMallConsumerShareDetailClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"分享详情\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/member/index\", component: GenPagesMallConsumerMemberIndexClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"会员中心\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/message-detail\", component: GenPagesMallConsumerMessageDetailClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"消息详情\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/red-packets/index\", component: GenPagesMallConsumerRedPacketsIndexClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"我的红包\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/bank-cards/index\", component: GenPagesMallConsumerBankCardsIndexClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"银行卡管理\"]]) } as UniPageRoute)\n__uniRoutes.push({ path: \"pages/mall/consumer/bank-cards/add\", component: GenPagesMallConsumerBankCardsAddClass, meta: { isQuit: false } as UniPageMeta, style: _uM([[\"navigationBarTitleText\",\"添加银行卡\"]]) } as UniPageRoute)\n}\nconst __uniTabBar: Map | null = _uM([[\"color\",\"#999999\"],[\"selectedColor\",\"#ff5000\"],[\"borderStyle\",\"black\"],[\"backgroundColor\",\"#ffffff\"],[\"list\",[_uM([[\"pagePath\",\"pages/main/index\"],[\"text\",\"首页\"],[\"iconPath\",\"static/tabbar/home.png\"],[\"selectedIconPath\",\"static/tabbar/home-active.png\"]]),_uM([[\"pagePath\",\"pages/main/category\"],[\"text\",\"分类\"],[\"iconPath\",\"static/tabbar/category.png\"],[\"selectedIconPath\",\"static/tabbar/category.png\"]]),_uM([[\"pagePath\",\"pages/main/cart\"],[\"text\",\"购物车\"],[\"iconPath\",\"static/tabbar/cart.png\"],[\"selectedIconPath\",\"static/tabbar/cart.png\"]]),_uM([[\"pagePath\",\"pages/main/profile\"],[\"text\",\"我的\"],[\"iconPath\",\"static/tabbar/user.png\"],[\"selectedIconPath\",\"static/tabbar/user.png\"]])]]])\nconst __uniLaunchPage: Map = _uM([[\"url\",\"pages/user/login\"],[\"style\",_uM([[\"navigationBarTitleText\",\"用户登录\"],[\"navigationStyle\",\"custom\"]])]])\nfunction defineAppConfig(){\n __uniConfig.entryPagePath = '/pages/user/login'\n __uniConfig.globalStyle = _uM([[\"navigationBarTextStyle\",\"black\"],[\"navigationBarTitleText\",\"商城\"],[\"navigationBarBackgroundColor\",\"#ffffff\"],[\"backgroundColor\",\"#f5f5f5\"]])\n __uniConfig.getTabBarConfig = ():Map | null => _uM([[\"color\",\"#999999\"],[\"selectedColor\",\"#ff5000\"],[\"borderStyle\",\"black\"],[\"backgroundColor\",\"#ffffff\"],[\"list\",[_uM([[\"pagePath\",\"pages/main/index\"],[\"text\",\"首页\"],[\"iconPath\",\"static/tabbar/home.png\"],[\"selectedIconPath\",\"static/tabbar/home-active.png\"]]),_uM([[\"pagePath\",\"pages/main/category\"],[\"text\",\"分类\"],[\"iconPath\",\"static/tabbar/category.png\"],[\"selectedIconPath\",\"static/tabbar/category.png\"]]),_uM([[\"pagePath\",\"pages/main/cart\"],[\"text\",\"购物车\"],[\"iconPath\",\"static/tabbar/cart.png\"],[\"selectedIconPath\",\"static/tabbar/cart.png\"]]),_uM([[\"pagePath\",\"pages/main/profile\"],[\"text\",\"我的\"],[\"iconPath\",\"static/tabbar/user.png\"],[\"selectedIconPath\",\"static/tabbar/user.png\"]])]]])\n __uniConfig.tabBar = __uniConfig.getTabBarConfig()\n __uniConfig.conditionUrl = ''\n __uniConfig.uniIdRouter = new Map()\n \n __uniConfig.ready = true\n}\n","import supa from '@/components/supadb/aksupainstance.uts'\r\nimport type { AkReqResponse } from '@/uni_modules/ak-req/index.uts'\r\nimport type { OrderOptions } from '@/components/supadb/aksupa.uts'\r\n\r\nconst OLD_URL = '192.168.1.61:18000'\r\nconst NEW_URL = '119.146.131.237:9126'\r\n\r\nfunction fixImageUrl(url: string | null): string {\r\n if (url == null) return ''\r\n if (url.indexOf(OLD_URL) >= 0) {\r\n return url.replace(OLD_URL, NEW_URL)\r\n }\r\n return url\r\n}\r\n\r\nfunction fixImageUrls(urls: any): string[] {\r\n if (urls == null) return []\r\n if (Array.isArray(urls)) {\r\n const result: string[] = []\r\n const arr = urls as any[]\r\n for (let i = 0; i < arr.length; i++) {\r\n try {\r\n const urlStr = JSON.stringify(arr[i])\r\n if (urlStr != null && urlStr.startsWith('\"') && urlStr.endsWith('\"')) {\r\n const fixed = fixImageUrl(urlStr.substring(1, urlStr.length - 1))\r\n if (fixed !== '') result.push(fixed)\r\n }\r\n } catch (e) {}\r\n }\r\n return result\r\n }\r\n return []\r\n}\r\n\r\n// 使用单例 Supabase 客户端\r\n// const supa = createClient(SUPA_URL, SUPA_KEY)\r\n\r\n// 辅助函数:安全获取字符串值\r\nfunction safeGetString(obj: UTSJSONObject, key: string): string {\r\n try {\r\n const rawVal = obj.get(key)\r\n if (rawVal == null) return ''\r\n const strVal = JSON.stringify(rawVal)\r\n if (strVal == null) return ''\r\n if (strVal.startsWith('\"') && strVal.endsWith('\"')) {\r\n return strVal.substring(1, strVal.length - 1)\r\n }\r\n return strVal\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:50','safeGetString error for key:', key, e)\r\n return ''\r\n }\r\n}\r\n\r\n// 辅助函数:安全获取数值\r\nfunction safeGetNumber(obj: UTSJSONObject, key: string): number {\r\n try {\r\n const rawVal = obj.get(key)\r\n if (rawVal == null) return 0\r\n try {\r\n const numVal = rawVal as number\r\n if (!isNaN(numVal)) return numVal\r\n } catch (e) {}\r\n return 0\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:66','safeGetNumber error for key:', key, e)\r\n return 0\r\n }\r\n}\r\n\r\n// 辅助函数:安全获取布尔值\r\nfunction safeGetBoolean(obj: UTSJSONObject, key: string): boolean {\r\n try {\r\n const rawVal = obj.get(key)\r\n if (rawVal == null) return false\r\n try {\r\n const boolVal = rawVal as boolean\r\n return boolVal\r\n } catch (e) {}\r\n return false\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:82','safeGetBoolean error for key:', key, e)\r\n return false\r\n }\r\n}\r\n\r\n// 辅助函数:安全获取字符串数组\r\nfunction safeGetStringArray(obj: UTSJSONObject, key: string): string[] {\r\n try {\r\n const rawVal = obj.get(key)\r\n if (rawVal != null && Array.isArray(rawVal)) {\r\n return rawVal as string[]\r\n }\r\n return [] as string[]\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:96','safeGetStringArray error for key:', key, e)\r\n return [] as string[]\r\n }\r\n}\r\n\r\n// 辅助函数:从原始数据解析商品\r\nfunction parseProductFromRaw(item: any): Product {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:104','[parseProductFromRaw] 开始解析商品')\r\n const itemObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n __f__('log','at utils/supabaseService.uts:106','[parseProductFromRaw] JSON转换成功')\r\n \r\n const mainImageUrl = fixImageUrl(safeGetString(itemObj, 'main_image_url'))\r\n const imageUrls = fixImageUrls(safeGetStringArray(itemObj, 'image_urls'))\r\n __f__('log','at utils/supabaseService.uts:110','[parseProductFromRaw] 图片处理完成')\r\n \r\n const result: Product = {\r\n id: safeGetString(itemObj, 'id'),\r\n name: safeGetString(itemObj, 'name'),\r\n description: safeGetString(itemObj, 'description'),\r\n base_price: safeGetNumber(itemObj, 'base_price'),\r\n price: safeGetNumber(itemObj, 'base_price'),\r\n original_price: safeGetNumber(itemObj, 'market_price'),\r\n market_price: safeGetNumber(itemObj, 'market_price'),\r\n main_image_url: mainImageUrl,\r\n image_url: mainImageUrl,\r\n images: imageUrls,\r\n category_id: safeGetString(itemObj, 'category_id'),\r\n brand_id: safeGetString(itemObj, 'brand_id'),\r\n merchant_id: safeGetString(itemObj, 'merchant_id'),\r\n total_stock: safeGetNumber(itemObj, 'total_stock'),\r\n stock: safeGetNumber(itemObj, 'total_stock'),\r\n sale_count: safeGetNumber(itemObj, 'sale_count'),\r\n status: safeGetNumber(itemObj, 'status'),\r\n is_featured: safeGetBoolean(itemObj, 'is_featured'),\r\n is_new: safeGetBoolean(itemObj, 'is_new'),\r\n is_hot: safeGetBoolean(itemObj, 'is_hot'),\r\n specification: safeGetString(itemObj, 'specification'),\r\n usage: safeGetString(itemObj, 'usage'),\r\n side_effects: safeGetString(itemObj, 'side_effects'),\r\n precautions: safeGetString(itemObj, 'precautions'),\r\n expiry_date: safeGetString(itemObj, 'expiry_date'),\r\n storage_conditions: safeGetString(itemObj, 'storage_conditions'),\r\n approval_number: safeGetString(itemObj, 'approval_number'),\r\n created_at: safeGetString(itemObj, 'created_at')\r\n }\r\n __f__('log','at utils/supabaseService.uts:142','[parseProductFromRaw] 商品解析成功:', result.name)\r\n return result\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:145','parseProductFromRaw error:', e)\r\n return {\r\n id: '',\r\n name: '',\r\n description: '',\r\n base_price: 0,\r\n price: 0,\r\n original_price: 0,\r\n market_price: 0,\r\n main_image_url: '',\r\n image_url: '',\r\n images: [] as string[],\r\n category_id: '',\r\n brand_id: '',\r\n merchant_id: '',\r\n total_stock: 0,\r\n stock: 0,\r\n sale_count: 0,\r\n status: 0,\r\n is_featured: false,\r\n is_new: false,\r\n is_hot: false,\r\n specification: '',\r\n usage: '',\r\n side_effects: '',\r\n precautions: '',\r\n expiry_date: '',\r\n storage_conditions: '',\r\n approval_number: '',\r\n created_at: ''\r\n } as Product\r\n }\r\n}\r\n\r\n// 类型定义\r\nexport type Brand = {\r\n id: string\r\n name: string\r\n logo_url: string\r\n description: string\r\n}\r\n\r\nexport type Category = {\r\n id: string\r\n name: string\r\n icon: string\r\n description: string\r\n color: string\r\n parent_id?: string\r\n level?: number\r\n slug?: string\r\n created_at?: string\r\n}\r\n\r\nexport type Product = {\r\n id: string\r\n category_id: string\r\n merchant_id: string\r\n name: string\r\n subtitle?: string\r\n description?: string\r\n base_price?: number\r\n market_price?: number\r\n cost_price?: number\r\n main_image_url?: string\r\n image_url?: string\r\n image_urls?: string\r\n video_urls?: string\r\n images?: string[]\r\n sale_count?: number\r\n view_count?: number\r\n total_stock?: number\r\n available_stock?: number\r\n is_hot?: boolean\r\n is_new?: boolean\r\n is_featured?: boolean\r\n status?: number\r\n rating_avg?: number\r\n rating_count?: number\r\n rating?: number\r\n review_count?: number\r\n brand_id?: string\r\n shop_id?: string\r\n tags?: string\r\n attributes?: string\r\n specification?: string\r\n usage?: string\r\n side_effects?: string\r\n precautions?: string\r\n expiry_date?: string\r\n storage_conditions?: string\r\n approval_number?: string\r\n created_at?: string\r\n updated_at?: string\r\n price?: number\r\n original_price?: number\r\n stock?: number\r\n sales?: number\r\n cover?: string\r\n brand_name?: string\r\n category_name?: string\r\n shop_name?: string\r\n merchant_name?: string\r\n}\r\n\r\nexport type Shop = {\r\n id: string\r\n merchant_id: string\r\n shop_name: string\r\n shop_logo?: string\r\n shop_banner?: string\r\n description?: string\r\n contact_name?: string\r\n contact_phone?: string\r\n rating_avg?: number\r\n total_sales?: number\r\n product_count?: number\r\n total_sales_count?: number\r\n created_at?: string\r\n}\r\n\r\nexport type CartItem = {\r\n id: string\r\n user_id: string\r\n product_id: string\r\n sku_id?: string\r\n merchant_id?: string\r\n quantity: number\r\n selected: boolean\r\n product_name?: string\r\n product_image?: string\r\n product_price?: number\r\n product_specification?: string\r\n shop_id?: string\r\n shop_name?: string\r\n created_at?: string\r\n updated_at?: string\r\n}\r\n\r\nexport type UserAddress = {\r\n id: string\r\n user_id: string\r\n recipient_name: string\r\n phone: string\r\n province: string\r\n city: string\r\n district: string\r\n detail_address: string\r\n postal_code?: string\r\n is_default: boolean\r\n label?: string\r\n created_at?: string\r\n updated_at?: string\r\n}\r\n\r\nexport type UserCoupon = {\r\n id: string\r\n user_id: string\r\n template_id: string\r\n coupon_code: string\r\n status: number // 1: unused, 2: used, 3: expired\r\n received_at: string\r\n expire_at: string\r\n used_at?: string\r\n // join fields from template or view\r\n template_name?: string\r\n amount?: number\r\n min_spend?: number\r\n name?: string\r\n title?: string\r\n}\r\n\r\nexport type ChatRoom = {\r\n id: string\r\n user_id: string\r\n merchant_id: string\r\n shop_name: string\r\n shop_logo?: string\r\n last_message?: string\r\n last_message_at?: string\r\n unread_count: number\r\n is_top: boolean\r\n created_at?: string\r\n updated_at?: string\r\n}\r\n\r\nexport type Notification = {\r\n id: string\r\n user_id: string\r\n type: string\r\n title: string\r\n content: string\r\n icon_url?: string\r\n link_url?: string\r\n is_read: boolean\r\n extra_data?: string\r\n created_at?: string\r\n}\r\n\r\nexport type ChatMessage = {\r\n id: string\r\n session_id?: string\r\n sender_id?: string\r\n receiver_id?: string\r\n content: string\r\n msg_type: string\r\n is_read: boolean\r\n is_from_user: boolean\r\n extra_data?: string\r\n created_at?: string\r\n}\r\n\r\nexport type PaginatedResponse = {\r\n data: T[]\r\n total: number\r\n page: number\r\n limit: number\r\n hasmore: boolean\r\n}\r\n\r\nexport type ProductSku = {\r\n id: string\r\n product_id: string\r\n sku_code: string\r\n specifications: string // JSON string\r\n price: number\r\n market_price?: number\r\n cost_price?: number\r\n stock?: number\r\n warning_stock?: number\r\n image_url?: string\r\n weight?: number\r\n status?: number\r\n created_at?: string\r\n}\r\n\r\nexport type AddAddressParams = {\r\n recipient_name: string\r\n phone: string\r\n province: string\r\n city: string\r\n district: string\r\n detail_address: string\r\n postal_code?: string\r\n is_default?: boolean\r\n label?: string\r\n}\r\n\r\nexport type UpdateAddressParams = {\r\n recipient_name?: string\r\n phone?: string\r\n province?: string\r\n city?: string\r\n district?: string\r\n detail_address?: string\r\n postal_code?: string\r\n is_default?: boolean\r\n label?: string\r\n}\r\n\r\nexport type CreateOrderParams = {\r\n merchant_id: string\r\n product_amount: number\r\n shipping_fee: number\r\n total_amount: number\r\n shipping_address: any\r\n items: any[]\r\n}\r\n\r\nexport type ShopOrderParams = {\r\n shipping_address: any\r\n shopGroups: any[]\r\n deliveryFee: number\r\n discountAmount: number\r\n}\r\n\r\nexport type ShopOrderResponse = {\r\n success: boolean\r\n orderIds: string[]\r\n error?: string\r\n}\r\n\r\nexport type RefundResponse = {\r\n success: boolean\r\n message: string\r\n}\r\n\r\nexport type ConfirmReceiptResponse = {\r\n success: boolean\r\n error?: string\r\n}\r\n\r\nclass SupabaseService {\r\n // 获取当前用户ID\r\n public getCurrentUserId(): string | null {\r\n try {\r\n // 1. 优先从 Supabase 会话获取\r\n const session = supa.getSession()\r\n if (session != null && session.user != null) {\r\n return session.user.getString('id')\r\n }\r\n \r\n // 2. 尝试从 Storage 恢复 Session (针对 App 重启后内存丢失的情况)\r\n // 注意:这里无法异步调用 hydrate,所以只能依赖 UI 层或 init 层的预加载\r\n // 但我们可以返回本地存储 ID 作为 fallback,前提是 Token 有效\r\n \r\n // 后备:尝试从本地存储获取\r\n const userId = uni.getStorageSync('user_id')\r\n return userId != null ? userId as string : null\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:455','获取用户ID失败:', e)\r\n return null\r\n }\r\n }\r\n\r\n // 确保会话有效 (异步)\r\n async ensureSession(): Promise {\r\n let session = supa.getSession()\r\n if (session.user == null) {\r\n __f__('log','at utils/supabaseService.uts:464','Session user is null, attempting to hydrate from storage...')\r\n await supa.hydrateSessionFromStorage()\r\n session = supa.getSession()\r\n }\r\n \r\n if (session.user != null) {\r\n // 同步 user_id 到 storage 保持一致\r\n const uid = session.user!!.getString('id')\r\n if (uid != null) {\r\n uni.setStorageSync('user_id', uid)\r\n return uid\r\n }\r\n }\r\n return this.getCurrentUserId()\r\n }\r\n\r\n // 获取所有分类\r\n async getCategories(): Promise {\r\n try {\r\n const response = await supa\r\n .from('ml_categories')\r\n .select('*')\r\n .order('name', { ascending: true })\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:490','获取分类失败:', response.error)\r\n return []\r\n }\r\n \r\n const rawData = response.data\r\n if (rawData == null) {\r\n return []\r\n }\r\n \r\n const categories: Category[] = []\r\n const rawList = rawData as any[]\r\n for (let i: number = 0; i < rawList.length; i++) {\r\n const item = rawList[i]\r\n const catObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n const idVal = catObj.get('id')\r\n const nameVal = catObj.get('name')\r\n const iconVal = catObj.get('icon')\r\n const iconUrlVal = catObj.get('icon_url')\r\n const descVal = catObj.get('description')\r\n const colorVal = catObj.get('color')\r\n const parentIdVal = catObj.get('parent_id')\r\n const levelVal = catObj.get('level')\r\n \r\n const cat: Category = {\r\n id: (typeof idVal == 'string') ? (idVal as string) : '',\r\n name: (typeof nameVal == 'string') ? (nameVal as string) : '',\r\n icon: (typeof iconVal == 'string') ? (iconVal as string) : ((typeof iconUrlVal == 'string') ? (iconUrlVal as string) : ''),\r\n description: (typeof descVal == 'string') ? (descVal as string) : '',\r\n color: (typeof colorVal == 'string') ? (colorVal as string) : '#4CAF50',\r\n parent_id: (typeof parentIdVal == 'string') ? (parentIdVal as string) : null,\r\n level: (typeof levelVal == 'number') ? (levelVal as number) : 0\r\n } as Category\r\n categories.push(cat)\r\n }\r\n return categories\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:526','获取分类异常:', error)\r\n return []\r\n }\r\n }\r\n\r\n // 根据ID获取单个分类\r\n async getCategoryById(categoryId: string): Promise {\r\n try {\r\n const response = await supa\r\n .from('ml_categories')\r\n .select('*')\r\n .eq('id', categoryId)\r\n .limit(1)\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:542','获取分类失败:', response.error)\r\n return null\r\n }\r\n \r\n const rawData = response.data\r\n if (rawData == null) {\r\n return null\r\n }\r\n \r\n // 处理数组返回值\r\n const rawList = rawData as any[]\r\n if (rawList.length == 0) {\r\n return null\r\n }\r\n \r\n const item = rawList[0]\r\n const catObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n const idVal = catObj.get('id')\r\n const nameVal = catObj.get('name')\r\n const iconVal = catObj.get('icon')\r\n const iconUrlVal = catObj.get('icon_url')\r\n const descVal = catObj.get('description')\r\n const colorVal = catObj.get('color')\r\n const parentIdVal = catObj.get('parent_id')\r\n const levelVal = catObj.get('level')\r\n \r\n const cat: Category = {\r\n id: (typeof idVal == 'string') ? (idVal as string) : '',\r\n name: (typeof nameVal == 'string') ? (nameVal as string) : '',\r\n icon: (typeof iconVal == 'string') ? (iconVal as string) : ((typeof iconUrlVal == 'string') ? (iconUrlVal as string) : ''),\r\n description: (typeof descVal == 'string') ? (descVal as string) : '',\r\n color: (typeof colorVal == 'string') ? (colorVal as string) : '#4CAF50',\r\n parent_id: (typeof parentIdVal == 'string') ? (parentIdVal as string) : null,\r\n level: (typeof levelVal == 'number') ? (levelVal as number) : 0\r\n } as Category\r\n return cat\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:579','获取分类异常:', error)\r\n return null\r\n }\r\n }\r\n\r\n // 获取一级分类\r\n async getParentCategories(): Promise {\r\n try {\r\n const response = await supa\r\n .from('ml_categories')\r\n .select('*')\r\n .is('parent_id', null)\r\n .order('sort_order', { ascending: true })\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:595','获取一级分类失败:', response.error)\r\n return []\r\n }\r\n \r\n const rawData = response.data\r\n if (rawData == null) {\r\n return []\r\n }\r\n\r\n const categories: Category[] = []\r\n const rawList = rawData as Array\r\n for (let i = 0; i < rawList.length; i++) {\r\n const item = rawList[i]\r\n const icon = this.getCategoryIcon(item)\r\n \r\n // 安全获取属性\r\n const idVal = item['id']\r\n const nameVal = item['name']\r\n const descVal = item['description']\r\n const colorVal = item['color']\r\n const slugVal = item['slug']\r\n \r\n const cat: Category = {\r\n id: (typeof idVal == 'string') ? (idVal as string) : '',\r\n name: (typeof nameVal == 'string') ? (nameVal as string) : '',\r\n icon: icon,\r\n description: (typeof descVal == 'string') ? (descVal as string) : '',\r\n color: (typeof colorVal == 'string') ? (colorVal as string) : '#ff5000',\r\n level: 1,\r\n slug: (typeof slugVal == 'string') ? (slugVal as string) : ''\r\n }\r\n categories.push(cat)\r\n }\r\n return categories\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:630','获取一级分类异常:', error)\r\n return []\r\n }\r\n }\r\n\r\n // 获取子分类\r\n async getSubCategories(parentId: string): Promise {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:638','[getSubCategories] 开始获取子分类, parentId:', parentId)\r\n const response = await supa\r\n .from('ml_categories')\r\n .select('*')\r\n .order('sort_order', { ascending: true })\r\n .execute()\r\n \r\n __f__('log','at utils/supabaseService.uts:645','[getSubCategories] 查询完成')\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:648','获取子分类失败:', response.error)\r\n return []\r\n }\r\n \r\n const rawData = response.data\r\n if (rawData == null) {\r\n __f__('log','at utils/supabaseService.uts:654','[getSubCategories] 数据为空')\r\n return []\r\n }\r\n\r\n const categories: Category[] = []\r\n const rawList = rawData as any[]\r\n __f__('log','at utils/supabaseService.uts:660','[getSubCategories] 原始数据条数:', rawList.length)\r\n \r\n for (let i = 0; i < rawList.length; i++) {\r\n const item = rawList[i]\r\n const itemObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n \r\n // 手动过滤 parent_id\r\n const itemParentId = safeGetString(itemObj, 'parent_id')\r\n const isMatch = (itemParentId.length > 0 && itemParentId == parentId)\r\n if (!isMatch) {\r\n continue\r\n }\r\n \r\n const icon = this.getCategoryIcon(itemObj)\r\n const cat: Category = {\r\n id: safeGetString(itemObj, 'id'),\r\n name: safeGetString(itemObj, 'name'),\r\n icon: icon,\r\n description: safeGetString(itemObj, 'description'),\r\n color: safeGetString(itemObj, 'color').length > 0 ? safeGetString(itemObj, 'color') : '#ff5000',\r\n level: 2,\r\n parent_id: safeGetString(itemObj, 'parent_id'),\r\n slug: safeGetString(itemObj, 'slug')\r\n }\r\n categories.push(cat)\r\n }\r\n __f__('log','at utils/supabaseService.uts:686','[getSubCategories] 返回分类数量:', categories.length)\r\n return categories\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:689','获取子分类异常:', error)\r\n return []\r\n }\r\n }\r\n\r\n // 获取分类图标的辅助方法\r\n getCategoryIcon(item: UTSJSONObject): string {\r\n const itemObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n const icon = safeGetString(itemObj, 'icon')\r\n if (icon.length > 0) {\r\n return icon\r\n }\r\n const iconUrl = safeGetString(itemObj, 'icon_url')\r\n if (iconUrl.length > 0) {\r\n return iconUrl\r\n }\r\n const name = safeGetString(itemObj, 'name')\r\n if (name.includes('数码') || name.includes('电器') || name.includes('手机')) return '📱'\r\n if (name.includes('服装') || name.includes('衣服') || name.includes('鞋')) return '👕'\r\n if (name.includes('食品') || name.includes('水果') || name.includes('零食')) return '🍎'\r\n if (name.includes('美妆') || name.includes('护肤') || name.includes('化妆')) return '💄'\r\n if (name.includes('母婴') || name.includes('婴儿') || name.includes('儿童')) return '👶'\r\n if (name.includes('家居') || name.includes('家具') || name.includes('装饰')) return '🏠'\r\n if (name.includes('图书') || name.includes('文具')) return '📚'\r\n if (name.includes('运动') || name.includes('户外') || name.includes('健身')) return '⚽'\r\n if (name.includes('医药') || name.includes('保健') || name.includes('健康')) return '💊'\r\n return '📦'\r\n }\r\n\r\n // 获取所有品牌\r\n async getBrands(): Promise {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:721','[getBrands] 开始获取品牌数据...')\r\n const response = await supa\r\n .from('ml_brands')\r\n .select('id, name, logo_url, description, is_active')\r\n .order('name', { ascending: true })\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:729','获取品牌失败:', response.error)\r\n return []\r\n }\r\n \r\n const rawData = response.data\r\n if (rawData == null) {\r\n __f__('log','at utils/supabaseService.uts:735','[getBrands] 数据为空')\r\n return []\r\n }\r\n \r\n const brands: Brand[] = []\r\n const rawList = rawData as any[]\r\n __f__('log','at utils/supabaseService.uts:741','[getBrands] 数据条数:', rawList.length)\r\n \r\n for (let i: number = 0; i < rawList.length; i++) {\r\n const item = rawList[i]\r\n const brandObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n const idVal = brandObj.get('id')\r\n const nameVal = brandObj.get('name')\r\n const logoVal = brandObj.get('logo_url')\r\n const descVal = brandObj.get('description')\r\n const isActiveVal = brandObj.get('is_active')\r\n \r\n let isActiveBool: boolean = true\r\n if (isActiveVal != null) {\r\n if (typeof isActiveVal == 'boolean') {\r\n isActiveBool = isActiveVal as boolean\r\n } else if (typeof isActiveVal == 'number') {\r\n isActiveBool = (isActiveVal as number) === 1\r\n }\r\n }\r\n if (!isActiveBool) {\r\n continue\r\n }\r\n \r\n const brand: Brand = {\r\n id: (typeof idVal == 'string') ? (idVal as string) : '',\r\n name: (typeof nameVal == 'string') ? (nameVal as string) : '',\r\n logo_url: (typeof logoVal == 'string') ? (logoVal as string) : '',\r\n description: (typeof descVal == 'string') ? (descVal as string) : ''\r\n } as Brand\r\n brands.push(brand)\r\n }\r\n __f__('log','at utils/supabaseService.uts:772','[getBrands] 返回品牌数量:', brands.length)\r\n return brands\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:775','获取品牌异常:', error)\r\n return []\r\n }\r\n }\r\n\r\n // 获取指定分类的商品\r\n async getProductsByCategory(\r\n categoryId: string, \r\n page: number = 1, \r\n limit: number = 20\r\n ): Promise> {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:787','[getProductsByCategory] 开始查询,分类ID:', categoryId, '页码:', page)\r\n \r\n // 在数据库层面进行分类过滤\r\n const response = await supa\r\n .from('ml_products_detail_view')\r\n .select('*', { count: 'exact' })\r\n .eq('category_id', categoryId)\r\n .eq('status', '1') // 使用字符串 '1' 而不是整数 1\r\n .order('sale_count', { ascending: false })\r\n .page(page)\r\n .limit(limit)\r\n .execute()\r\n \r\n __f__('log','at utils/supabaseService.uts:800','[getProductsByCategory] 查询完成,total:', response.total)\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:803','获取商品失败:', response.error)\r\n return {\r\n data: [] as Product[],\r\n total: 0,\r\n page,\r\n limit,\r\n hasmore: false\r\n }\r\n }\r\n \r\n const rawData = response.data\r\n if (rawData == null) {\r\n return {\r\n data: [] as Product[],\r\n total: 0,\r\n page,\r\n limit,\r\n hasmore: false\r\n }\r\n }\r\n \r\n const products: Product[] = []\r\n const rawList = rawData as any[]\r\n __f__('log','at utils/supabaseService.uts:826','[getProductsByCategory] 返回数据条数:', rawList.length)\r\n \r\n for (let i: number = 0; i < rawList.length; i++) {\r\n const item = rawList[i]\r\n products.push(parseProductFromRaw(item))\r\n }\r\n \r\n return {\r\n data: products,\r\n total: response.total ?? products.length,\r\n page,\r\n limit,\r\n hasmore: response.hasmore ?? false\r\n }\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:841','获取商品异常:', error)\r\n return {\r\n data: [] as Product[],\r\n total: 0,\r\n page,\r\n limit,\r\n hasmore: false\r\n }\r\n }\r\n }\r\n\r\n // 根据商品ID获取SKU列表\r\n async getProductSkus(productId: string): Promise {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:855','[getProductSkus] 开始获取SKU,商品ID:', productId)\r\n const response = await supa\r\n .from('ml_product_skus')\r\n .select('*')\r\n .eq('product_id', productId)\r\n .eq('status', '1')\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:864','获取商品SKU失败:', response.error)\r\n return []\r\n }\r\n \r\n const rawData = response.data\r\n if (rawData == null) return []\r\n \r\n const skus: ProductSku[] = []\r\n const rawList = rawData as any[]\r\n __f__('log','at utils/supabaseService.uts:873','[getProductSkus] 获取到SKU数量:', rawList.length)\r\n \r\n for (let i = 0; i < rawList.length; i++) {\r\n const item = rawList[i]\r\n const skuObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n \r\n const rawId = skuObj.get('id')\r\n const rawSkuCode = skuObj.get('sku_code')\r\n const rawProdId = skuObj.get('product_id')\r\n const rawPrice = skuObj.get('price')\r\n const rawStock = skuObj.get('stock')\r\n const rawImageUrl = skuObj.get('image_url')\r\n const rawSpecs = skuObj.get('specifications')\r\n \r\n let specsStr = ''\r\n if (rawSpecs != null) {\r\n try {\r\n if (typeof rawSpecs == 'string') {\r\n specsStr = rawSpecs as string\r\n } else {\r\n specsStr = JSON.stringify(rawSpecs)\r\n }\r\n } catch(e) {\r\n __f__('error','at utils/supabaseService.uts:896','解析SKU规格失败', e)\r\n }\r\n }\r\n \r\n const sku: ProductSku = {\r\n id: (typeof rawId == 'string') ? (rawId as string) : '',\r\n product_id: (typeof rawProdId == 'string') ? (rawProdId as string) : '',\r\n sku_code: (typeof rawSkuCode == 'string') ? (rawSkuCode as string) : '',\r\n specifications: specsStr,\r\n price: (typeof rawPrice == 'number') ? (rawPrice as number) : 0,\r\n stock: (typeof rawStock == 'number') ? (rawStock as number) : 0,\r\n image_url: (typeof rawImageUrl == 'string') ? (rawImageUrl as string) : '',\r\n status: 1\r\n }\r\n skus.push(sku)\r\n }\r\n return skus\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:914','获取商品SKU异常:', error)\r\n return []\r\n }\r\n }\r\n\r\n // 搜索商品\r\n async searchProducts(\r\n keyword: string, \r\n page: number = 1, \r\n limit: number = 20,\r\n sortBy: string = 'sales',\r\n ascending: boolean = false\r\n ): Promise> {\r\n try {\r\n const keywordLower = keyword.toLowerCase()\r\n const encodedKeyword = encodeURIComponent(keywordLower)\r\n const orString = `name.ilike.%${encodedKeyword}%,description.ilike.%${encodedKeyword}%,subtitle.ilike.%${encodedKeyword}%,brand_name.ilike.%${encodedKeyword}%`\r\n __f__('log','at utils/supabaseService.uts:931','[searchProducts] 搜索关键词:', keyword, '编码后:', encodedKeyword)\r\n __f__('log','at utils/supabaseService.uts:932','[searchProducts] or条件:', orString)\r\n \r\n let query = supa\r\n .from('ml_products_detail_view')\r\n .select('*', { count: 'exact' })\r\n .eq('status', 1)\r\n .or(orString)\r\n \r\n if (sortBy === 'price') {\r\n query = query.order('base_price', { ascending })\r\n } else if (sortBy === 'sales' || sortBy === 'sale_count') {\r\n query = query.order('sale_count', { ascending: false })\r\n } else {\r\n query = query.order('sale_count', { ascending: false })\r\n }\r\n \r\n const response = await query\r\n .page(page)\r\n .limit(limit)\r\n .execute()\r\n \r\n let dataLength = 0\r\n try {\r\n const respData = response.data\r\n if (respData != null && Array.isArray(respData)) {\r\n dataLength = (respData as any[]).length\r\n }\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:960','[searchProducts] 获取数据长度失败:', e)\r\n }\r\n let statusNum = 0\r\n try {\r\n statusNum = response.status as number\r\n } catch (e) {}\r\n __f__('log','at utils/supabaseService.uts:966','[searchProducts] 响应状态:', statusNum, '数据条数:', dataLength)\r\n \r\n let hasError = false\r\n try {\r\n hasError = response.error != null\r\n } catch (e) {}\r\n if (hasError) {\r\n __f__('error','at utils/supabaseService.uts:973','[searchProducts] 搜索商品失败:', response.error)\r\n return {\r\n data: [] as Product[],\r\n total: 0,\r\n page,\r\n limit,\r\n hasmore: false\r\n }\r\n }\r\n \r\n const rawData = response.data\r\n __f__('log','at utils/supabaseService.uts:984','[searchProducts] rawData:', rawData != null ? 'not null' : 'null')\r\n if (rawData == null) {\r\n return {\r\n data: [] as Product[],\r\n total: 0,\r\n page,\r\n limit,\r\n hasmore: false\r\n }\r\n }\r\n \r\n const products: Product[] = []\r\n let rawList: any[] = []\r\n try {\r\n rawList = rawData as any[]\r\n __f__('log','at utils/supabaseService.uts:999','[searchProducts] rawList长度:', rawList.length)\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:1001','[searchProducts] 转换rawList失败:', e)\r\n return {\r\n data: [] as Product[],\r\n total: 0,\r\n page,\r\n limit,\r\n hasmore: false\r\n }\r\n }\r\n \r\n for (let i = 0; i < rawList.length; i++) {\r\n const item = rawList[i]\r\n __f__('log','at utils/supabaseService.uts:1013','[searchProducts] 处理第', i + 1, '个商品')\r\n products.push(parseProductFromRaw(item))\r\n }\r\n \r\n let totalNum = 0\r\n try {\r\n totalNum = response.total as number\r\n } catch (e) {}\r\n let hasmoreVal = false\r\n try {\r\n hasmoreVal = response.hasmore as boolean\r\n } catch (e) {}\r\n \r\n return {\r\n data: products,\r\n total: totalNum > 0 ? totalNum : products.length,\r\n page,\r\n limit,\r\n hasmore: hasmoreVal\r\n }\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:1034','搜索商品异常:', error)\r\n return {\r\n data: [] as Product[],\r\n total: 0,\r\n page,\r\n limit,\r\n hasmore: false\r\n }\r\n }\r\n }\r\n\r\n // 搜索店铺\r\n async searchShops(\r\n keyword: string,\r\n page: number = 1,\r\n limit: number = 20\r\n ): Promise> {\r\n try {\r\n const encodedKeyword = encodeURIComponent(keyword)\r\n const response = await supa\r\n .from('ml_shops')\r\n .select('*', { count: 'exact' })\r\n .ilike('shop_name', `%${encodedKeyword}%`)\r\n .order('product_count', { ascending: false })\r\n .page(page)\r\n .limit(limit)\r\n .execute()\r\n\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:1063','搜索店铺失败:', response.error)\r\n return { data: [] as Shop[], total: 0, page, limit, hasmore: false }\r\n }\r\n\r\n const rawData = response.data\r\n if (rawData == null) {\r\n return { data: [] as Shop[], total: 0, page, limit, hasmore: false }\r\n }\r\n\r\n const shops: Shop[] = []\r\n const dataList = rawData as any[]\r\n for (let i = 0; i < dataList.length; i++) {\r\n const item = dataList[i]\r\n const shopObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n \r\n // 手动过滤 status\r\n const rawStatus = shopObj.get('status')\r\n let statusNum: number = 0\r\n if (typeof rawStatus == 'number') {\r\n statusNum = rawStatus as number\r\n }\r\n if (statusNum !== 1) continue\r\n \r\n // 手动创建 Shop 对象,避免安卓端类型转换错误\r\n const shop: Shop = {\r\n id: shopObj.getString('id') ?? '',\r\n merchant_id: shopObj.getString('merchant_id') ?? '',\r\n shop_name: shopObj.getString('shop_name') ?? '',\r\n shop_logo: shopObj.getString('shop_logo'),\r\n shop_banner: shopObj.getString('shop_banner'),\r\n description: shopObj.getString('description'),\r\n contact_name: shopObj.getString('contact_name'),\r\n contact_phone: shopObj.getString('contact_phone'),\r\n rating_avg: shopObj.getNumber('rating_avg'),\r\n total_sales: shopObj.getNumber('total_sales'),\r\n product_count: shopObj.getNumber('product_count'),\r\n total_sales_count: shopObj.getNumber('total_sales_count'),\r\n created_at: shopObj.getString('created_at')\r\n }\r\n shops.push(shop)\r\n }\r\n\r\n return {\r\n data: shops,\r\n total: response.total ?? shops.length,\r\n page,\r\n limit,\r\n hasmore: response.hasmore ?? false\r\n }\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:1113','搜索店铺异常:', error)\r\n return { data: [] as Shop[], total: 0, page, limit, hasmore: false }\r\n }\r\n }\r\n\r\n // 获取单个商品详情\r\n async getProductById(productId: string): Promise {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:1121','[getProductById] 开始获取商品详情,ID:', productId)\r\n const response = await supa\r\n .from('ml_products_detail_view')\r\n .select('*')\r\n .eq('id', productId)\r\n .limit(1)\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:1130','获取商品详情失败:', response.error)\r\n return null\r\n }\r\n \r\n const rawData = response.data\r\n if (rawData == null) {\r\n __f__('log','at utils/supabaseService.uts:1136','[getProductById] 数据为空')\r\n return null\r\n }\r\n \r\n const rawList = rawData as any[]\r\n if (rawList.length == 0) {\r\n __f__('log','at utils/supabaseService.uts:1142','[getProductById] 未找到商品')\r\n return null\r\n }\r\n \r\n const item = rawList[0]\r\n const product = parseProductFromRaw(item)\r\n __f__('log','at utils/supabaseService.uts:1148','[getProductById] 成功获取商品:', product.name)\r\n return product\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:1151','获取商品详情异常:', error)\r\n return null\r\n }\r\n }\r\n\r\n // --- 关注店铺相关 ---\r\n\r\n // 检查是否已关注店铺\r\n async isShopFollowed(shopId: string, userId: string): Promise {\r\n try {\r\n const res = await supa\r\n .from('ml_shop_follows')\r\n .select('id', { count: 'exact' })\r\n .eq('shop_id', shopId)\r\n .eq('user_id', userId)\r\n .limit(1)\r\n .execute()\r\n \r\n return (res.total != null && res.total! > 0)\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:1171','Check follow error:', e)\r\n return false\r\n }\r\n }\r\n\r\n // 关注店铺\r\n async followShop(shopId: string, userId: string): Promise {\r\n try {\r\n const res = await supa\r\n .from('ml_shop_follows')\r\n .insert({\r\n user_id: userId,\r\n shop_id: shopId\r\n })\r\n .execute()\r\n \r\n return res.error == null\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:1189','Follow shop error:', e)\r\n return false\r\n }\r\n }\r\n\r\n // 取消关注\r\n async unfollowShop(shopId: string, userId: string): Promise {\r\n try {\r\n const res = await supa\r\n .from('ml_shop_follows')\r\n .eq('shop_id', shopId)\r\n .eq('user_id', userId)\r\n .delete()\r\n .execute()\r\n \r\n return res.error == null\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:1206','Unfollow shop error:', e)\r\n return false\r\n }\r\n }\r\n\r\n // 获取我关注的店铺列表\r\n async getFollowedShops(userId: string): Promise {\r\n try {\r\n // 关联查询店铺信息\r\n const res = await supa\r\n .from('ml_shop_follows')\r\n .select('*, ml_shops(*)') \r\n .eq('user_id', userId)\r\n .order('created_at', { ascending: false })\r\n .execute()\r\n \r\n if (res.error != null) {\r\n __f__('error','at utils/supabaseService.uts:1223','getFollowedShops error:', res.error)\r\n return []\r\n }\r\n \r\n return res.data as any[]\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:1229','getFollowedShops exception:', e)\r\n return []\r\n }\r\n }\r\n\r\n // 根据商户ID获取店铺信息\r\n async getShopByMerchantId(merchantId: string): Promise {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:1237','[getShopByMerchantId] 开始获取店铺信息,merchantId:', merchantId)\r\n // 1. Try querying by merchant_id\r\n let response = await supa\r\n .from('ml_shops')\r\n .select('*')\r\n .eq('merchant_id', merchantId)\r\n .limit(1)\r\n .execute()\r\n \r\n if (response.error == null && response.data != null && (response.data as any[]).length > 0) {\r\n const shopData = (response.data as any[])[0]\r\n const shop = this.parseShopFromRaw(shopData)\r\n __f__('log','at utils/supabaseService.uts:1249','[getShopByMerchantId] 通过 merchant_id 找到店铺:', shop.shop_name)\r\n return shop\r\n }\r\n\r\n // 2. Fallback: Try querying by id (Maybe the passed ID is the Shop ID?)\r\n __f__('log','at utils/supabaseService.uts:1254','getShopByMerchantId: merchant_id not found, trying id...', merchantId)\r\n response = await supa\r\n .from('ml_shops')\r\n .select('*')\r\n .eq('id', merchantId)\r\n .limit(1)\r\n .execute()\r\n\r\n if (response.error == null && response.data != null && (response.data as any[]).length > 0) {\r\n __f__('log','at utils/supabaseService.uts:1263','Found shop by ID instead of MerchantID')\r\n const shopData = (response.data as any[])[0]\r\n const shop = this.parseShopFromRaw(shopData)\r\n return shop\r\n }\r\n\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:1270','获取店铺信息失败:', response.error)\r\n }\r\n return null\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:1274','获取店铺信息异常:', error)\r\n return null\r\n }\r\n }\r\n \r\n // 解析店铺数据\r\n parseShopFromRaw(item: any): Shop {\r\n const itemObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n \r\n const getSafeString = (key: string): string => {\r\n const val = itemObj.get(key)\r\n if (val == null) return ''\r\n if (typeof val == 'string') return val\r\n return ''\r\n }\r\n \r\n const getSafeNumber = (key: string): number => {\r\n const val = itemObj.get(key)\r\n if (val == null) return 0\r\n if (typeof val == 'number') return val\r\n return 0\r\n }\r\n \r\n return {\r\n id: getSafeString('id'),\r\n merchant_id: getSafeString('merchant_id'),\r\n shop_name: getSafeString('shop_name'),\r\n shop_logo: getSafeString('shop_logo'),\r\n shop_banner: getSafeString('shop_banner'),\r\n description: getSafeString('description'),\r\n contact_name: getSafeString('contact_name'),\r\n contact_phone: getSafeString('contact_phone'),\r\n rating_avg: getSafeNumber('rating_avg'),\r\n total_sales: getSafeNumber('total_sales'),\r\n product_count: getSafeNumber('product_count'),\r\n total_sales_count: getSafeNumber('total_sales_count'),\r\n created_at: getSafeString('created_at')\r\n } as Shop\r\n }\r\n\r\n // 根据商户ID获取商品列表\r\n async getProductsByMerchantId(merchantId: string, page: number = 1, limit: number = 20): Promise> {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:1317','getProductsByMerchantId querying for:', merchantId)\r\n \r\n // 1. Try fetching from view strictly first\r\n let query = supa\r\n .from('ml_products_detail_view')\r\n .select('*', { count: 'exact' })\r\n .eq('merchant_id', merchantId)\r\n // .eq('status', 1) // Temporarily disabled status check to see if products exist at all\r\n .order('created_at', { ascending: false })\r\n .page(page)\r\n .limit(limit)\r\n \r\n const response = await query.execute()\r\n \r\n // 检查视图结果:如果有错误 OR 数据为空,都尝试去查原始表\r\n if (response.error != null || (response.data != null && (response.data as any[]).length === 0)) {\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:1334','获取商户商品失败 (View):', response.error)\r\n } else {\r\n __f__('log','at utils/supabaseService.uts:1336','View returned 0 products, trying raw table fallback...')\r\n }\r\n \r\n // Fallback: Try raw table\r\n __f__('log','at utils/supabaseService.uts:1340','Falling back to raw ml_products table...')\r\n const query2 = supa\r\n .from('ml_products')\r\n .select('*', { count: 'exact' })\r\n .eq('merchant_id', merchantId)\r\n // .eq('status', 1) // Also disabled here\r\n .order('created_at', { ascending: false })\r\n .page(page)\r\n .limit(limit)\r\n \r\n const res2 = await query2.execute()\r\n if (res2.error != null) {\r\n __f__('error','at utils/supabaseService.uts:1352','获取商户商品失败 (Raw):', res2.error)\r\n return {data:[] as Product[], total:0, page, limit, hasmore:false}\r\n }\r\n \r\n __f__('log','at utils/supabaseService.uts:1356',`Fallback (Raw) found: ${(res2.data as any[]).length} products`)\r\n \r\n const mappedData: Product[] = []\r\n const rawData = res2.data as any[]\r\n for(let i = 0; i < rawData.length; i++) {\r\n const item = JSON.parse(JSON.stringify(rawData[i])) as UTSJSONObject\r\n const images: string[] = []\r\n \r\n const mainImageUrl = fixImageUrl(item.getString('main_image_url'))\r\n if (mainImageUrl != null && mainImageUrl !== '') {\r\n images.push(mainImageUrl)\r\n }\r\n\r\n const imageUrlsRaw = item.get('image_urls')\r\n if (imageUrlsRaw != null) {\r\n try {\r\n if (Array.isArray(imageUrlsRaw)) {\r\n const arr = imageUrlsRaw as string[]\r\n if (arr.length > 0 && images.length === 0) {\r\n for (let j = 0; j < arr.length; j++) {\r\n const fixedUrl = fixImageUrl(arr[j])\r\n if (fixedUrl !== '') images.push(fixedUrl)\r\n }\r\n }\r\n } else {\r\n const rawUrlStr = imageUrlsRaw as string\r\n if (rawUrlStr.startsWith('[')) {\r\n const parsed = JSON.parse(rawUrlStr)\r\n if (Array.isArray(parsed) && images.length === 0) {\r\n for (let j = 0; j < parsed.length; j++) {\r\n const fixedUrl = fixImageUrl(parsed[j] as string)\r\n if (fixedUrl !== '') images.push(fixedUrl)\r\n }\r\n }\r\n } else {\r\n const fixedUrl = fixImageUrl(rawUrlStr)\r\n if (fixedUrl !== '' && images.indexOf(fixedUrl) === -1) images.push(fixedUrl)\r\n }\r\n }\r\n } catch(e) {\r\n __f__('error','at utils/supabaseService.uts:1396','解析图片数组失败:', e)\r\n }\r\n }\r\n \r\n if (images.length === 0) {\r\n images.push('/static/default-product.png')\r\n }\r\n \r\n let safePrice = item.getNumber('base_price')\r\n if (safePrice == null) {\r\n const p = item.getNumber('price')\r\n safePrice = p != null ? p : 0\r\n }\r\n \r\n let safeOriginalPrice = item.getNumber('market_price')\r\n if (safeOriginalPrice == null) {\r\n const op = item.getNumber('original_price')\r\n safeOriginalPrice = op != null ? op : safePrice\r\n }\r\n \r\n let safeStock = item.getNumber('total_stock')\r\n if (safeStock == null) {\r\n let as_ = item.getNumber('available_stock')\r\n if (as_ == null) {\r\n const s = item.getNumber('stock')\r\n safeStock = s != null ? s : 0\r\n } else {\r\n safeStock = as_\r\n }\r\n }\r\n \r\n let safeSales = item.getNumber('sale_count')\r\n if (safeSales == null) {\r\n const s = item.getNumber('sales')\r\n safeSales = s != null ? s : 0\r\n }\r\n \r\n const product: Product = {\r\n id: item.getString('id') ?? '',\r\n category_id: item.getString('category_id') ?? '',\r\n merchant_id: item.getString('merchant_id') ?? '',\r\n name: item.getString('name') ?? '',\r\n description: item.getString('description') ?? '',\r\n images: images,\r\n price: safePrice,\r\n original_price: safeOriginalPrice,\r\n stock: safeStock,\r\n sales: safeSales,\r\n status: item.getNumber('status') ?? 1,\r\n created_at: item.getString('created_at') ?? '',\r\n base_price: safePrice,\r\n market_price: safeOriginalPrice,\r\n main_image_url: images.length > 0 ? images[0] : '',\r\n sale_count: safeSales,\r\n total_stock: safeStock\r\n } as Product\r\n mappedData.push(product)\r\n }\r\n\r\n return {\r\n data: mappedData,\r\n total: res2.total ?? 0,\r\n page,\r\n limit,\r\n hasmore: res2.hasmore ?? false\r\n }\r\n }\r\n \r\n __f__('log','at utils/supabaseService.uts:1464',`Merchant products found: ${(response.data as any[]).length}`)\r\n \r\n const viewData = response.data as any[]\r\n const parsedProducts: Product[] = []\r\n for (let i = 0; i < viewData.length; i++) {\r\n parsedProducts.push(parseProductFromRaw(viewData[i]))\r\n }\r\n \r\n return {\r\n data: parsedProducts,\r\n total: response.total ?? 0,\r\n page,\r\n limit,\r\n hasmore: response.hasmore ?? false\r\n }\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:1480','获取商户商品异常:', error)\r\n return {\r\n data: [] as Product[],\r\n total: 0,\r\n page,\r\n limit,\r\n hasmore: false\r\n }\r\n }\r\n }\r\n\r\n // 根据店铺ID获取商品列表(新增)\r\n async getProductsByShopId(shopId: string, page: number = 1, limit: number = 20): Promise> {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:1494','getProductsByShopId querying for:', shopId)\r\n \r\n // 1. Try fetching from view with shop_id\r\n let query = supa\r\n .from('ml_products_detail_view')\r\n .select('*', { count: 'exact' })\r\n .eq('shop_id', shopId)\r\n .order('created_at', { ascending: false })\r\n .page(page)\r\n .limit(limit)\r\n \r\n const response = await query.execute()\r\n \r\n // 检查视图结果:如果有错误 OR 数据为空,都尝试去查原始表\r\n if (response.error != null || (response.data != null && (response.data as any[]).length === 0)) {\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:1510','获取店铺商品失败 (View):', response.error)\r\n } else {\r\n __f__('log','at utils/supabaseService.uts:1512','View returned 0 products, trying raw table fallback...')\r\n }\r\n \r\n // Fallback: Try raw table with shop_id\r\n __f__('log','at utils/supabaseService.uts:1516','Falling back to raw ml_products table with shop_id...')\r\n const query2 = supa\r\n .from('ml_products')\r\n .select('*', { count: 'exact' })\r\n .eq('shop_id', shopId)\r\n .order('created_at', { ascending: false })\r\n .page(page)\r\n .limit(limit)\r\n \r\n const res2 = await query2.execute()\r\n if (res2.error != null) {\r\n __f__('error','at utils/supabaseService.uts:1527','获取店铺商品失败 (Raw):', res2.error)\r\n return {data:[] as Product[], total:0, page, limit, hasmore:false}\r\n }\r\n \r\n __f__('log','at utils/supabaseService.uts:1531',`Fallback (Raw) found: ${(res2.data as any[]).length} products`)\r\n \r\n const mappedData: Product[] = []\r\n const rawData = res2.data as any[]\r\n for(let i = 0; i < rawData.length; i++) {\r\n const item = JSON.parse(JSON.stringify(rawData[i])) as UTSJSONObject\r\n const images: string[] = []\r\n \r\n const mainImageUrl = fixImageUrl(item.getString('main_image_url'))\r\n if (mainImageUrl != null && mainImageUrl !== '') {\r\n images.push(mainImageUrl)\r\n }\r\n\r\n const imageUrlsRaw = item.get('image_urls')\r\n if (imageUrlsRaw != null) {\r\n try {\r\n if (Array.isArray(imageUrlsRaw)) {\r\n const arr = imageUrlsRaw as string[]\r\n if (arr.length > 0 && images.length === 0) {\r\n for (let j = 0; j < arr.length; j++) {\r\n const fixedUrl = fixImageUrl(arr[j])\r\n if (fixedUrl !== '') images.push(fixedUrl)\r\n }\r\n }\r\n } else {\r\n const rawUrlStr = imageUrlsRaw as string\r\n if (rawUrlStr.startsWith('[')) {\r\n const parsed = JSON.parse(rawUrlStr)\r\n if (Array.isArray(parsed) && images.length === 0) {\r\n for (let j = 0; j < parsed.length; j++) {\r\n const fixedUrl = fixImageUrl(parsed[j] as string)\r\n if (fixedUrl !== '') images.push(fixedUrl)\r\n }\r\n }\r\n } else {\r\n const fixedUrl = fixImageUrl(rawUrlStr)\r\n if (fixedUrl !== '' && images.indexOf(fixedUrl) === -1) images.push(fixedUrl)\r\n }\r\n }\r\n } catch(e) {\r\n __f__('error','at utils/supabaseService.uts:1571','解析图片数组失败:', e)\r\n }\r\n }\r\n \r\n if (images.length === 0) {\r\n images.push('/static/default-product.png')\r\n }\r\n \r\n let safePrice = item.getNumber('base_price')\r\n if (safePrice == null) {\r\n const p = item.getNumber('price')\r\n safePrice = p != null ? p : 0\r\n }\r\n \r\n let safeOriginalPrice = item.getNumber('market_price')\r\n if (safeOriginalPrice == null) {\r\n const op = item.getNumber('original_price')\r\n safeOriginalPrice = op != null ? op : safePrice\r\n }\r\n \r\n let safeStock = item.getNumber('total_stock')\r\n if (safeStock == null) {\r\n let as_ = item.getNumber('available_stock')\r\n if (as_ == null) {\r\n const s = item.getNumber('stock')\r\n safeStock = s != null ? s : 0\r\n } else {\r\n safeStock = as_\r\n }\r\n }\r\n \r\n let safeSales = item.getNumber('sale_count')\r\n if (safeSales == null) {\r\n const s = item.getNumber('sales')\r\n safeSales = s != null ? s : 0\r\n }\r\n \r\n const product: Product = {\r\n id: item.getString('id') ?? '',\r\n category_id: item.getString('category_id') ?? '',\r\n merchant_id: item.getString('merchant_id') ?? '',\r\n name: item.getString('name') ?? '',\r\n description: item.getString('description') ?? '',\r\n images: images,\r\n price: safePrice,\r\n original_price: safeOriginalPrice,\r\n stock: safeStock,\r\n sales: safeSales,\r\n status: item.getNumber('status') ?? 1,\r\n created_at: item.getString('created_at') ?? '',\r\n base_price: safePrice,\r\n market_price: safeOriginalPrice,\r\n main_image_url: images.length > 0 ? images[0] : '',\r\n sale_count: safeSales,\r\n total_stock: safeStock\r\n } as Product\r\n mappedData.push(product)\r\n }\r\n\r\n return {\r\n data: mappedData,\r\n total: res2.total ?? 0,\r\n page,\r\n limit,\r\n hasmore: res2.hasmore ?? false\r\n }\r\n }\r\n \r\n __f__('log','at utils/supabaseService.uts:1639',`Shop products found: ${(response.data as any[]).length}`)\r\n \r\n const viewData = response.data as any[]\r\n const parsedProducts: Product[] = []\r\n for (let i = 0; i < viewData.length; i++) {\r\n parsedProducts.push(parseProductFromRaw(viewData[i]))\r\n }\r\n \r\n return {\r\n data: parsedProducts,\r\n total: response.total ?? 0,\r\n page,\r\n limit,\r\n hasmore: response.hasmore ?? false\r\n }\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:1655','获取店铺商品异常:', error)\r\n return {\r\n data: [] as Product[],\r\n total: 0,\r\n page,\r\n limit,\r\n hasmore: false\r\n }\r\n }\r\n }\r\n\r\n // 获取热销商品(按销量排序)\r\n async getHotProducts(limit: number = 10): Promise {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:1669','[getHotProducts] 开始获取热销商品...')\r\n \r\n // 在数据库层面过滤 status,获取更多数据以便手动过滤 is_hot\r\n const response = await supa\r\n .from('ml_products_detail_view')\r\n .select('id, name, description, base_price, market_price, main_image_url, image_urls, category_id, brand_id, merchant_id, total_stock, sale_count, status, is_featured, is_new, is_hot')\r\n .eq('status', '1') // 使用字符串 '1'\r\n .order('sale_count', { ascending: false })\r\n .limit(limit * 5) // 获取更多数据以便过滤\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:1681','获取热销商品失败:', response.error)\r\n return []\r\n }\r\n \r\n const rawData = response.data\r\n __f__('log','at utils/supabaseService.uts:1686','[getHotProducts] 原始数据条数:', rawData != null ? (rawData as any[]).length : 0)\r\n if (rawData == null) {\r\n __f__('log','at utils/supabaseService.uts:1688','[getHotProducts] 数据为空')\r\n return []\r\n }\r\n \r\n const products: Product[] = []\r\n const rawList = rawData as any[]\r\n for (let i: number = 0; i < rawList.length; i++) {\r\n const item = rawList[i]\r\n const prodObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n \r\n // 手动过滤 is_hot\r\n const rawIsHot = prodObj.get('is_hot')\r\n let isHotBool: boolean = false\r\n if (typeof rawIsHot == 'boolean') {\r\n isHotBool = rawIsHot as boolean\r\n } else if (typeof rawIsHot == 'number') {\r\n isHotBool = (rawIsHot as number) == 1\r\n }\r\n if (!isHotBool) continue\r\n \r\n products.push(parseProductFromRaw(item))\r\n \r\n // 达到目标数量就停止\r\n if (products.length >= limit) break\r\n }\r\n __f__('log','at utils/supabaseService.uts:1713','[getHotProducts] 最终返回商品数:', products.length)\r\n return products\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:1716','获取热销商品异常:', error)\r\n return []\r\n }\r\n }\r\n\r\n // 获取按销量排序的商品(所有商品,不限制 is_hot)\r\n async getProductsBySales(limit: number = 10): Promise {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:1724','[getProductsBySales] 开始获取销量排序商品...')\r\n const response = await supa\r\n .from('ml_products_detail_view')\r\n .select('id, name, description, base_price, market_price, main_image_url, image_urls, category_id, brand_id, merchant_id, total_stock, sale_count, status, is_featured, is_new, is_hot')\r\n .eq('status', '1')\r\n .order('sale_count', { ascending: false })\r\n .limit(limit)\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:1734','获取销量排序商品失败:', response.error)\r\n return []\r\n }\r\n \r\n const rawData = response.data\r\n if (rawData == null) {\r\n return []\r\n }\r\n \r\n const products: Product[] = []\r\n const rawList = rawData as any[]\r\n for (let i: number = 0; i < rawList.length; i++) {\r\n const item = rawList[i]\r\n products.push(parseProductFromRaw(item))\r\n }\r\n __f__('log','at utils/supabaseService.uts:1749','[getProductsBySales] 返回商品数:', products.length)\r\n return products\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:1752','获取销量排序商品异常:', error)\r\n return []\r\n }\r\n }\r\n\r\n // 获取按价格排序的商品(升序:从低到高)\r\n async getProductsByPrice(limit: number = 10, ascending: boolean = true): Promise {\r\n try {\r\n const response = await supa\r\n .from('ml_products_detail_view')\r\n .select('id, name, description, base_price, market_price, main_image_url, image_urls, category_id, brand_id, merchant_id, total_stock, sale_count, status, is_featured, is_new, is_hot')\r\n .eq('status', '1') // 在数据库层面过滤\r\n .order('base_price', { ascending })\r\n .limit(limit)\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:1769','获取价格排序商品失败:', response.error)\r\n return []\r\n }\r\n \r\n const rawData = response.data\r\n if (rawData == null) {\r\n return []\r\n }\r\n \r\n const products: Product[] = []\r\n const rawList = rawData as any[]\r\n for (let i: number = 0; i < rawList.length; i++) {\r\n const item = rawList[i]\r\n products.push(parseProductFromRaw(item))\r\n }\r\n return products\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:1786','获取价格排序商品异常:', error)\r\n return []\r\n }\r\n }\r\n\r\n // 获取新品(按创建时间排序,最新的在前)\r\n async getProductsByNewest(limit: number = 10): Promise {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:1794','[getProductsByNewest] 开始获取新品...')\r\n const response = await supa\r\n .from('ml_products_detail_view')\r\n .select('id, name, description, base_price, market_price, main_image_url, image_urls, category_id, brand_id, merchant_id, total_stock, sale_count, status, is_featured, is_new, is_hot')\r\n .eq('status', '1')\r\n .order('created_at', { ascending: false })\r\n .limit(limit * 5)\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:1804','获取新品失败:', response.error)\r\n return []\r\n }\r\n \r\n const rawData = response.data\r\n if (rawData == null) {\r\n return []\r\n }\r\n \r\n const products: Product[] = []\r\n const rawList = rawData as any[]\r\n for (let i: number = 0; i < rawList.length; i++) {\r\n const item = rawList[i]\r\n const prodObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n \r\n // 手动过滤 is_new\r\n const rawIsNew = prodObj.get('is_new')\r\n let isNewBool: boolean = false\r\n if (typeof rawIsNew == 'boolean') {\r\n isNewBool = rawIsNew as boolean\r\n } else if (typeof rawIsNew == 'number') {\r\n isNewBool = (rawIsNew as number) == 1\r\n }\r\n if (!isNewBool) continue\r\n \r\n products.push(parseProductFromRaw(item))\r\n if (products.length >= limit) break\r\n }\r\n \r\n // 如果 is_new 商品不足,补充普通商品\r\n if (products.length < limit) {\r\n __f__('log','at utils/supabaseService.uts:1835','[getProductsByNewest] is_new商品不足,补充普通商品')\r\n const addedIds = new Set()\r\n for (let i = 0; i < products.length; i++) {\r\n addedIds.add(products[i].id)\r\n }\r\n \r\n for (let i: number = 0; i < rawList.length; i++) {\r\n const item = rawList[i]\r\n const prodObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n const rawId = prodObj.get('id')\r\n const itemId = (typeof rawId == 'string') ? (rawId as string) : ''\r\n \r\n if (!addedIds.has(itemId)) {\r\n products.push(parseProductFromRaw(item))\r\n addedIds.add(itemId)\r\n if (products.length >= limit) break\r\n }\r\n }\r\n }\r\n \r\n __f__('log','at utils/supabaseService.uts:1855','[getProductsByNewest] 返回商品数:', products.length)\r\n return products\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:1858','获取新品异常:', error)\r\n return []\r\n }\r\n }\r\n\r\n // 获取推荐商品(is_featured=true)\r\n async getRecommendedProducts(limit: number = 10): Promise {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:1866','[getRecommendedProducts] 开始获取推荐商品...')\r\n const response = await supa\r\n .from('ml_products_detail_view')\r\n .select('id, name, description, base_price, market_price, main_image_url, image_urls, category_id, brand_id, merchant_id, total_stock, sale_count, status, is_featured, is_new, is_hot')\r\n .eq('status', '1') // 在数据库层面过滤\r\n .order('sale_count', { ascending: false })\r\n .limit(limit * 5) // 获取更多数据以便过滤 is_featured\r\n .execute()\r\n \r\n __f__('log','at utils/supabaseService.uts:1875','[getRecommendedProducts] 查询完成')\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:1878','获取推荐商品失败:', response.error)\r\n return []\r\n }\r\n \r\n const rawData = response.data\r\n if (rawData == null) {\r\n __f__('log','at utils/supabaseService.uts:1884','[getRecommendedProducts] 数据为空')\r\n return []\r\n }\r\n \r\n const products: Product[] = []\r\n const rawList = rawData as any[]\r\n __f__('log','at utils/supabaseService.uts:1890','[getRecommendedProducts] 数据条数:', rawList.length)\r\n \r\n for (let i: number = 0; i < rawList.length; i++) {\r\n const item = rawList[i]\r\n const prodObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n const rawFeatured = prodObj.get('is_featured')\r\n \r\n let isFeaturedBool: boolean = false\r\n if (typeof rawFeatured == 'boolean') {\r\n isFeaturedBool = rawFeatured as boolean\r\n } else if (typeof rawFeatured == 'number') {\r\n isFeaturedBool = (rawFeatured as number) == 1\r\n }\r\n if (!isFeaturedBool) {\r\n continue\r\n }\r\n \r\n products.push(parseProductFromRaw(item))\r\n if (products.length >= limit) break\r\n }\r\n return products\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:1912','获取推荐商品异常:', error)\r\n return []\r\n }\r\n }\r\n\r\n // 获取特价商品(这里假设没有specific flag, just use logic or tag if exists, defaulting to hot for now or just skip)\r\n // Modify to use compatible logic if badge column doesn't exist\r\n async getDiscountProducts(limit: number = 10): Promise {\r\n return [] as Product[] // 暂无特价字段\r\n }\r\n\r\n // 获取当前用户的购物车商品(关联商品和店铺信息)\r\n async getCartItems(): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('warn','at utils/supabaseService.uts:1928','用户未登录,无法获取购物车')\r\n return []\r\n }\r\n\r\n // 查询购物车表,并关联商品表(使用内联关联)\r\n // 注意:使用 !inner 进行内连接,或者 left join (默认)\r\n // 修改查询语法以符合 PostgREST 规范\r\n // 尝试简化查询,先只查购物车,再查商品,避免复杂的嵌套查询导致 400 错误\r\n const response = await supa\r\n .from('ml_shopping_cart')\r\n .select('*')\r\n .eq('user_id', userId)\r\n .order('created_at', { ascending: false })\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:1944','获取购物车失败:', response.error)\r\n return []\r\n }\r\n \r\n const cartData = response.data as any[]\r\n // __f__('log','at utils/supabaseService.uts:1949','Raw Cart Data:', JSON.stringify(cartData))\r\n \r\n if (cartData == null || cartData.length === 0) {\r\n return []\r\n }\r\n\r\n // 收集所有 product_id 和 sku_id\r\n const productIds: string[] = []\r\n const skuIds: string[] = []\r\n for (let i = 0; i < cartData.length; i++) {\r\n let item = cartData[i]\r\n let pid: string = ''\r\n let sid: string = ''\r\n if (item instanceof UTSJSONObject) {\r\n pid = item.getString('product_id') ?? ''\r\n sid = item.getString('sku_id') ?? ''\r\n } else {\r\n const itemObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n pid = itemObj.getString('product_id') ?? ''\r\n sid = itemObj.getString('sku_id') ?? ''\r\n }\r\n if (pid !== '' && !productIds.includes(pid)) {\r\n productIds.push(pid)\r\n }\r\n if (sid !== '' && !skuIds.includes(sid)) {\r\n skuIds.push(sid)\r\n }\r\n }\r\n\r\n // 批量查询商品详情 (使用视图关联店铺信息,修复字段名 specification -> attributes)\r\n const productMap = new Map()\r\n \r\n if (productIds.length > 0) {\r\n // Convert string array to any array for .in()\r\n const productIdsAny: any[] = []\r\n for(let i=0; i()\r\n const merchantIds: string[] = []\r\n // 遍历 productMap 获取 merchant_id\r\n productMap.forEach((p: any, pid: string) => {\r\n let mid: string = ''\r\n if (p instanceof UTSJSONObject) {\r\n mid = p.getString('merchant_id') ?? ''\r\n } else {\r\n const pObj = JSON.parse(JSON.stringify(p)) as UTSJSONObject\r\n mid = pObj.getString('merchant_id') ?? ''\r\n }\r\n if (mid !== '' && !merchantIds.includes(mid)) {\r\n merchantIds.push(mid)\r\n }\r\n })\r\n \r\n if (merchantIds.length > 0) {\r\n const merchantIdsAny: any[] = []\r\n for(let i=0; i()\r\n if (skuIds.length > 0) {\r\n const skuIdsAny: any[] = []\r\n for(let i=0; i 0) {\r\n productPrice = skuPrice\r\n }\r\n const skuImg = sku.getString('image_url')\r\n if (skuImg != null && skuImg !== '') {\r\n productImage = skuImg\r\n }\r\n \r\n const specRaw = sku.get('specifications')\r\n if (specRaw != null) {\r\n if (typeof specRaw === 'string') {\r\n productSpec = specRaw\r\n } else if (specRaw instanceof UTSJSONObject) {\r\n const keys = ['规格', '颜色', '尺码', '容量', '版本', '型号']\r\n const result: string[] = []\r\n for (let k = 0; k < keys.length; k++) {\r\n const key = keys[k]\r\n const val = specRaw.get(key)\r\n if (val != null && val !== '') {\r\n result.push(`${val}`)\r\n }\r\n }\r\n if (result.length > 0) {\r\n productSpec = result.join(' ')\r\n } else {\r\n const allKeys = UTSJSONObject.keys(specRaw)\r\n const parts: string[] = []\r\n for(let k = 0; k < allKeys.length; k++) {\r\n let val = specRaw.get(allKeys[k])\r\n if (val != null) {\r\n parts.push(`${val}`)\r\n }\r\n }\r\n productSpec = parts.join(' ')\r\n }\r\n } else {\r\n try {\r\n let jsonStr = JSON.stringify(specRaw)\r\n productSpec = jsonStr.replace(/[\"{}]/g, '').replace(/,/g, ' ').replace(/:/g, ' ')\r\n } catch (e) {}\r\n }\r\n }\r\n } else {\r\n const sObj = JSON.parse(JSON.stringify(sku)) as UTSJSONObject\r\n const skuPrice = sObj.getNumber('price') ?? 0\r\n if (skuPrice > 0) productPrice = skuPrice\r\n\r\n const skuImg = sObj.getString('image_url') ?? ''\r\n if (skuImg !== '') productImage = skuImg\r\n\r\n const specRaw = sObj.get('specifications')\r\n if (specRaw != null) {\r\n if (typeof specRaw === 'string') {\r\n productSpec = specRaw\r\n } else if (specRaw instanceof UTSJSONObject) {\r\n const keys = ['规格', '颜色', '尺码', '容量', '版本', '型号']\r\n const result: string[] = []\r\n for (let k = 0; k < keys.length; k++) {\r\n const key = keys[k]\r\n const val = specRaw.get(key)\r\n if (val != null && val !== '') {\r\n result.push(`${val}`)\r\n }\r\n }\r\n if (result.length > 0) {\r\n productSpec = result.join(' ')\r\n } else {\r\n const allKeys = UTSJSONObject.keys(specRaw)\r\n const parts: string[] = []\r\n for(let k = 0; k < allKeys.length; k++) {\r\n let val = specRaw.get(allKeys[k])\r\n if (val != null) {\r\n parts.push(`${val}`)\r\n }\r\n }\r\n productSpec = parts.join(' ')\r\n }\r\n } else {\r\n try {\r\n let jsonStr = JSON.stringify(specRaw)\r\n productSpec = jsonStr.replace(/[\"{}]/g, '').replace(/,/g, ' ').replace(/:/g, ' ')\r\n } catch (e) {}\r\n }\r\n }\r\n }\r\n }\r\n\r\n let shopIdStr = merchantId != '' ? merchantId : 'unknown_shop'\r\n\r\n \r\n cartItems.push({\r\n id: itemId,\r\n user_id: userIdVal,\r\n product_id: productId,\r\n sku_id: skuId,\r\n merchant_id: merchantId,\r\n quantity: quantity,\r\n selected: selected,\r\n product_name: productName,\r\n product_image: productImage,\r\n product_price: productPrice,\r\n product_specification: productSpec,\r\n shop_id: shopIdStr,\r\n shop_name: shopNameStr,\r\n created_at: createdAt,\r\n updated_at: updatedAt\r\n } as CartItem)\r\n }\r\n }\r\n \r\n return cartItems\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:2296','获取购物车异常:', error)\r\n return []\r\n }\r\n }\r\n\r\n // 获取用户通知 (系统、活动、订单)\r\n async getUserNotifications(type: string | null = null): Promise {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:2304','[getUserNotifications] 开始获取通知')\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return []\r\n\r\n let query = supa\r\n .from('ml_notifications')\r\n .select('*')\r\n .eq('user_id', userId)\r\n \r\n if (type != null) {\r\n query = query.eq('type', type)\r\n }\r\n \r\n const response = await query.order('created_at', { ascending: false }).execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:2320','获取通知失败:', response.error)\r\n return []\r\n }\r\n \r\n const rawData = response.data\r\n if (rawData == null) return []\r\n \r\n const notifications: Notification[] = []\r\n const rawList = rawData as any[]\r\n __f__('log','at utils/supabaseService.uts:2329','[getUserNotifications] 获取到通知数量:', rawList.length)\r\n \r\n for (let i = 0; i < rawList.length; i++) {\r\n const item = rawList[i]\r\n const noteObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n \r\n const getSafeString = (key: string): string => {\r\n const val = noteObj.get(key)\r\n if (val == null) return ''\r\n if (typeof val == 'string') return val\r\n return ''\r\n }\r\n \r\n const getSafeNumber = (key: string): number => {\r\n const val = noteObj.get(key)\r\n if (val == null) return 0\r\n if (typeof val == 'number') return val\r\n return 0\r\n }\r\n \r\n const getSafeBoolean = (key: string): boolean => {\r\n const val = noteObj.get(key)\r\n if (val == null) return false\r\n if (typeof val == 'boolean') return val\r\n if (typeof val == 'number') return (val as number) == 1\r\n return false\r\n }\r\n \r\n const note: Notification = {\r\n id: getSafeString('id'),\r\n user_id: getSafeString('user_id'),\r\n type: getSafeString('type'),\r\n title: getSafeString('title'),\r\n content: getSafeString('content'),\r\n is_read: getSafeBoolean('is_read'),\r\n icon_url: getSafeString('icon_url'),\r\n link_url: getSafeString('link_url'),\r\n extra_data: getSafeString('extra_data'),\r\n created_at: getSafeString('created_at')\r\n }\r\n notifications.push(note)\r\n }\r\n return notifications\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:2373','获取通知异常:', e)\r\n return []\r\n }\r\n }\r\n\r\n // 获取聊天会话列表\r\n async getChatRooms(): Promise {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:2381','[getChatRooms] 开始获取聊天会话')\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return []\r\n\r\n const response = await supa\r\n .from('ml_chat_rooms')\r\n .select('*')\r\n .eq('user_id', userId)\r\n .order('updated_at', { ascending: false })\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:2393','获取聊天会话失败:', response.error)\r\n return []\r\n }\r\n \r\n const rawData = response.data\r\n if (rawData == null) return []\r\n \r\n const rooms: ChatRoom[] = []\r\n const rawList = rawData as any[]\r\n __f__('log','at utils/supabaseService.uts:2402','[getChatRooms] 获取到会话数量:', rawList.length)\r\n \r\n for (let i = 0; i < rawList.length; i++) {\r\n const item = rawList[i]\r\n const roomObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n \r\n const getSafeString = (key: string): string => {\r\n const val = roomObj.get(key)\r\n if (val == null) return ''\r\n if (typeof val == 'string') return val\r\n return ''\r\n }\r\n \r\n const getSafeNumber = (key: string): number => {\r\n const val = roomObj.get(key)\r\n if (val == null) return 0\r\n if (typeof val == 'number') return val\r\n return 0\r\n }\r\n \r\n const getSafeBoolean = (key: string): boolean => {\r\n const val = roomObj.get(key)\r\n if (val == null) return false\r\n if (typeof val == 'boolean') return val\r\n if (typeof val == 'number') return (val as number) == 1\r\n return false\r\n }\r\n \r\n const room: ChatRoom = {\r\n id: getSafeString('id'),\r\n user_id: getSafeString('user_id'),\r\n merchant_id: getSafeString('merchant_id'),\r\n shop_name: getSafeString('shop_name'),\r\n shop_logo: getSafeString('shop_logo'),\r\n last_message: getSafeString('last_message'),\r\n last_message_at: getSafeString('last_message_at'),\r\n unread_count: getSafeNumber('unread_count'),\r\n is_top: getSafeBoolean('is_top'),\r\n created_at: getSafeString('created_at'),\r\n updated_at: getSafeString('updated_at')\r\n }\r\n rooms.push(room)\r\n }\r\n return rooms\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:2447','获取聊天会话异常:', e)\r\n return []\r\n }\r\n }\r\n\r\n // 获取用户聊天消息\r\n async getUserChatMessages(): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return []\r\n\r\n const response = await supa\r\n .from('ml_chat_messages')\r\n .select('*')\r\n .or(`sender_id.eq.${userId},receiver_id.eq.${userId}`)\r\n .order('created_at', { ascending: false })\r\n .limit(50)\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:2467','获取聊天记录失败:', response.error)\r\n return []\r\n }\r\n return response.data as ChatMessage[]\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:2472','获取聊天记录异常:', e)\r\n return []\r\n }\r\n }\r\n\r\n // 获取与特定商家的聊天记录 (合并版本)\r\n async getChatMessages(merchantId: string, page: number = 1, pageSize: number = 20): Promise {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:2480','[getChatMessages] 开始获取聊天记录,merchantId:', merchantId, 'page:', page)\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return []\r\n\r\n const fromIndex = (page - 1) * pageSize\r\n const toIndex = fromIndex + pageSize - 1\r\n\r\n // 使用 or 组合精确条件查询:(我发给商家) OR (商家发给我)\r\n const queryStr = `and(sender_id.eq.${userId},receiver_id.eq.${merchantId}),and(sender_id.eq.${merchantId},receiver_id.eq.${userId})`\r\n \r\n const response = await supa\r\n .from('ml_chat_messages')\r\n .select('*')\r\n .or(queryStr)\r\n .order('created_at', { ascending: false }) // 最新在前\r\n .range(fromIndex, toIndex)\r\n .execute()\r\n\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:2499','getChatMessages error:', response.error)\r\n return []\r\n }\r\n \r\n const rawData = response.data\r\n if (rawData == null) return []\r\n \r\n const messages: ChatMessage[] = []\r\n const rawList = rawData as any[]\r\n __f__('log','at utils/supabaseService.uts:2508','[getChatMessages] 获取到消息数量:', rawList.length)\r\n \r\n for (let i = 0; i < rawList.length; i++) {\r\n const item = rawList[i]\r\n const msgObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n \r\n const getSafeString = (key: string): string => {\r\n const val = msgObj.get(key)\r\n if (val == null) return ''\r\n return val.toString()\r\n }\r\n \r\n const getSafeBoolean = (key: string): boolean => {\r\n const val = msgObj.get(key)\r\n if (val == null) return false\r\n if (typeof val == 'boolean') return val as boolean\r\n return (val.toString() == '1' || val.toString() == 'true')\r\n }\r\n \r\n const msg: ChatMessage = {\r\n id: getSafeString('id'),\r\n session_id: getSafeString('session_id'),\r\n sender_id: getSafeString('sender_id'),\r\n receiver_id: getSafeString('receiver_id'),\r\n content: getSafeString('content'),\r\n msg_type: getSafeString('msg_type'),\r\n is_read: getSafeBoolean('is_read'),\r\n is_from_user: getSafeBoolean('is_from_user'),\r\n extra_data: getSafeString('extra_data'),\r\n created_at: getSafeString('created_at')\r\n }\r\n messages.push(msg)\r\n }\r\n return messages\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:2543','获取聊天记录异常:', e)\r\n return []\r\n }\r\n }\r\n\r\n // 发送聊天消息\r\n async sendChatMessage(content: string, toId: string | null = null, type: string = 'text'): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return false\r\n \r\n const payload = {\r\n sender_id: userId,\r\n content: content,\r\n msg_type: type,\r\n is_from_user: true,\r\n created_at: new Date().toISOString()\r\n } as UTSJSONObject\r\n if (toId != null) {\r\n payload.set('receiver_id', toId)\r\n }\r\n\r\n const response = await supa\r\n .from('ml_chat_messages')\r\n .insert(payload)\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:2571','发送消息失败:', response.error)\r\n return false\r\n }\r\n return true\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:2576','发送消息异常:', e)\r\n return false\r\n }\r\n }\r\n\r\n // 模拟客服回复\r\n async simulateServiceReply(content: string): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return false\r\n\r\n const response = await supa\r\n .from('ml_chat_messages')\r\n .insert({\r\n receiver_id: userId,\r\n content: content,\r\n msg_type: 'text',\r\n is_from_user: false,\r\n created_at: new Date().toISOString()\r\n })\r\n .execute()\r\n return response.error == null\r\n } catch (e) {\r\n return false\r\n }\r\n }\r\n\r\n // 添加商品到购物车\r\n async addToCart(productId: string, quantity: number = 1, skuId: string = '', merchantId: string = ''): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('error','at utils/supabaseService.uts:2608','用户未登录,无法添加商品到购物车')\r\n return false\r\n }\r\n \r\n const realSkuId = (skuId != null && skuId.length > 0) ? skuId : null\r\n const realMerchantId = (merchantId != null && merchantId.length > 0) ? merchantId : null\r\n\r\n // 检查商品是否已在购物车中\r\n // 注意:必须处理 sku_id 为空的情况,使用 is.null 过滤器\r\n let query = supa\r\n .from('ml_shopping_cart')\r\n .select('*')\r\n .eq('user_id', userId)\r\n .eq('product_id', productId)\r\n \r\n if (realSkuId != null) {\r\n query = query.eq('sku_id', realSkuId)\r\n } else {\r\n query = query.is('sku_id', null)\r\n }\r\n\r\n const existingResponse = await query.single().execute()\r\n\r\n let existingItem: any | null = null\r\n \r\n if (existingResponse.data != null) {\r\n const rawData = existingResponse.data as any\r\n if (Array.isArray(rawData)) {\r\n if (rawData.length > 0) {\r\n existingItem = rawData[0]\r\n }\r\n } else {\r\n existingItem = rawData\r\n }\r\n }\r\n\r\n let response: AkReqResponse\r\n if (existingItem != null) {\r\n // 商品已存在,更新数量\r\n __f__('log','at utils/supabaseService.uts:2647','Found existing cart item:', JSON.stringify(existingItem))\r\n\r\n // 确保 existingItem.id 存在\r\n let itemId: string | null = null\r\n let itemQty: any | null = null\r\n\r\n if (existingItem instanceof UTSJSONObject) {\r\n itemId = existingItem.getString('id')\r\n itemQty = existingItem.getNumber('quantity')\r\n } else {\r\n const obj = JSON.parse(JSON.stringify(existingItem)) as UTSJSONObject\r\n itemId = obj.getString('id')\r\n itemQty = obj.getNumber('quantity')\r\n }\r\n\r\n if (itemId != null) {\r\n let currentQty = 0\r\n if (typeof itemQty === 'number') {\r\n currentQty = itemQty as number\r\n } else {\r\n const qStr = `${itemQty ?? 0}`\r\n currentQty = parseInt(qStr)\r\n }\r\n const newQty = currentQty + quantity\r\n\r\n response = await supa\r\n .from('ml_shopping_cart')\r\n .update({\r\n quantity: newQty,\r\n merchant_id: realMerchantId,\r\n updated_at: new Date().toISOString()\r\n })\r\n .eq('id', itemId)\r\n .execute()\r\n } else {\r\n __f__('error','at utils/supabaseService.uts:2682','购物车已有商品但缺少ID,无法更新. Data:', JSON.stringify(existingItem))\r\n return false\r\n }\r\n } else {\r\n // 商品不存在,添加新记录\r\n const cartPayload = new UTSJSONObject()\r\n cartPayload.set('user_id', userId)\r\n cartPayload.set('product_id', productId)\r\n cartPayload.set('sku_id', realSkuId)\r\n cartPayload.set('quantity', quantity)\r\n cartPayload.set('selected', true)\r\n cartPayload.set('created_at', new Date().toISOString())\r\n cartPayload.set('updated_at', new Date().toISOString())\r\n if (realMerchantId != null) {\r\n cartPayload.set('merchant_id', realMerchantId)\r\n }\r\n \r\n response = await supa\r\n .from('ml_shopping_cart')\r\n .insert(cartPayload)\r\n .execute()\r\n }\r\n\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:2706','添加商品到购物车失败:', response.error)\r\n return false\r\n }\r\n\r\n return true\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:2712','添加商品到购物车异常:', error)\r\n return false\r\n }\r\n }\r\n\r\n // 更新购物车商品数量\r\n async updateCartItemQuantity(cartItemId: string, quantity: number): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('error','at utils/supabaseService.uts:2722','用户未登录,无法更新购物车')\r\n return false\r\n }\r\n\r\n if (quantity < 1) {\r\n // 数量小于1时删除商品\r\n return await this.deleteCartItem(cartItemId)\r\n }\r\n\r\n const response = await supa\r\n .from('ml_shopping_cart')\r\n .update({\r\n quantity: quantity,\r\n updated_at: new Date().toISOString()\r\n })\r\n .eq('id', cartItemId)\r\n .eq('user_id', userId)\r\n .execute()\r\n\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:2742','更新购物车商品数量失败:', response.error)\r\n return false\r\n }\r\n\r\n return true\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:2748','更新购物车商品数量异常:', error)\r\n return false\r\n }\r\n }\r\n\r\n // 更新购物车商品选中状态\r\n async updateCartItemSelection(cartItemId: string, selected: boolean): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('error','at utils/supabaseService.uts:2758','用户未登录,无法更新购物车')\r\n return false\r\n }\r\n\r\n const response = await supa\r\n .from('ml_shopping_cart')\r\n .update({\r\n selected: selected,\r\n updated_at: new Date().toISOString()\r\n })\r\n .eq('id', cartItemId)\r\n .eq('user_id', userId)\r\n .execute()\r\n\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:2773','更新购物车商品选中状态失败:', response.error)\r\n return false\r\n }\r\n\r\n return true\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:2779','更新购物车商品选中状态异常:', error)\r\n return false\r\n }\r\n }\r\n\r\n // 批量更新购物车商品选中状态\r\n async batchUpdateCartItemSelection(cartItemIds: string[], selected: boolean): Promise {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:2787','[batchUpdateCartItemSelection] 开始批量更新')\r\n __f__('log','at utils/supabaseService.uts:2788','[batchUpdateCartItemSelection] cartItemIds:', JSON.stringify(cartItemIds))\r\n __f__('log','at utils/supabaseService.uts:2789','[batchUpdateCartItemSelection] cartItemIds length:', cartItemIds.length)\r\n __f__('log','at utils/supabaseService.uts:2790','[batchUpdateCartItemSelection] selected:', selected)\r\n \r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('error','at utils/supabaseService.uts:2794','用户未登录,无法更新购物车')\r\n return false\r\n }\r\n\r\n const response = await supa\r\n .from('ml_shopping_cart')\r\n .update({\r\n selected: selected,\r\n updated_at: new Date().toISOString()\r\n })\r\n .eq('user_id', userId)\r\n .in('id', cartItemIds as any[])\r\n .execute()\r\n\r\n __f__('log','at utils/supabaseService.uts:2808','[batchUpdateCartItemSelection] response.error:', response.error)\r\n __f__('log','at utils/supabaseService.uts:2809','[batchUpdateCartItemSelection] response.data:', JSON.stringify(response.data))\r\n\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:2812','批量更新购物车商品选中状态失败:', response.error)\r\n return false\r\n }\r\n\r\n return true\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:2818','批量更新购物车商品选中状态异常:', error)\r\n return false\r\n }\r\n }\r\n\r\n // 删除购物车商品\r\n async deleteCartItem(cartItemId: string): Promise {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:2826','正在执行删除购物车商品,ID:', cartItemId)\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('error','at utils/supabaseService.uts:2829','用户未登录,无法删除购物车商品')\r\n return false\r\n }\r\n\r\n const response = await supa\r\n .from('ml_shopping_cart')\r\n .eq('id', cartItemId)\r\n .eq('user_id', userId)\r\n .delete()\r\n .execute()\r\n\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:2841','删除购物车商品失败:', response.error)\r\n return false\r\n }\r\n\r\n return true\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:2847','删除购物车商品异常:', error)\r\n return false\r\n }\r\n }\r\n\r\n // 批量删除购物车商品\r\n async batchDeleteCartItems(cartItemIds: string[]): Promise {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:2855','[batchDeleteCartItems] 开始删除, ids:', cartItemIds.length)\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('error','at utils/supabaseService.uts:2858','用户未登录,无法删除购物车商品')\r\n return false\r\n }\r\n\r\n __f__('log','at utils/supabaseService.uts:2862','[batchDeleteCartItems] userId:', userId)\r\n const response = await supa\r\n .from('ml_shopping_cart')\r\n .eq('user_id', userId)\r\n .in('id', cartItemIds as any[])\r\n .delete()\r\n .execute()\r\n\r\n __f__('log','at utils/supabaseService.uts:2870','[batchDeleteCartItems] response.error:', response.error)\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:2872','批量删除购物车商品失败:', response.error)\r\n return false\r\n }\r\n\r\n __f__('log','at utils/supabaseService.uts:2876','[batchDeleteCartItems] 删除成功')\r\n return true\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:2879','批量删除购物车商品异常:', error)\r\n return false\r\n }\r\n }\r\n\r\n // 清空购物车\r\n async clearCart(): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('error','at utils/supabaseService.uts:2889','用户未登录,无法清空购物车')\r\n return false\r\n }\r\n\r\n const response = await supa\r\n .from('ml_shopping_cart')\r\n .eq('user_id', userId)\r\n .delete()\r\n .execute()\r\n\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:2900','清空购物车失败:', response.error)\r\n return false\r\n }\r\n\r\n return true\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:2906','清空购物车异常:', error)\r\n return false\r\n }\r\n }\r\n\r\n // 获取当前用户的所有地址\r\n async getAddresses(): Promise {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('warn','at utils/supabaseService.uts:2915','[getAddresses] 用户未登录,无法获取地址')\r\n return []\r\n }\r\n\r\n try {\r\n __f__('log','at utils/supabaseService.uts:2920','[getAddresses] 查询地址, userId:', userId)\r\n \r\n const response = await supa\r\n .from('ml_user_addresses')\r\n .select('*')\r\n .eq('user_id', userId)\r\n .order('is_default', { ascending: false })\r\n .order('created_at', { ascending: false })\r\n .execute()\r\n \r\n __f__('log','at utils/supabaseService.uts:2930','[getAddresses] response.error:', response.error)\r\n __f__('log','at utils/supabaseService.uts:2931','[getAddresses] response.data:', JSON.stringify(response.data))\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:2934','[getAddresses] 获取地址失败:', response.error)\r\n return []\r\n }\r\n \r\n const data = response.data\r\n if (data == null) {\r\n return []\r\n }\r\n \r\n const result: UserAddress[] = []\r\n const rawData = data as any[]\r\n for (let i = 0; i < rawData.length; i++) {\r\n const item = rawData[i]\r\n let itemObj: UTSJSONObject\r\n if (item instanceof UTSJSONObject) {\r\n itemObj = item as UTSJSONObject\r\n } else {\r\n itemObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n }\r\n \r\n const addr: UserAddress = {\r\n id: itemObj.getString('id') ?? '',\r\n user_id: itemObj.getString('user_id') ?? '',\r\n recipient_name: itemObj.getString('receiver_name') ?? itemObj.getString('recipient_name') ?? '',\r\n phone: itemObj.getString('receiver_phone') ?? itemObj.getString('phone') ?? '',\r\n province: itemObj.getString('province') ?? '',\r\n city: itemObj.getString('city') ?? '',\r\n district: itemObj.getString('district') ?? '',\r\n detail_address: itemObj.getString('address_detail') ?? itemObj.getString('detail_address') ?? '',\r\n is_default: itemObj.getBoolean('is_default') ?? false,\r\n label: itemObj.getString('label') ?? '',\r\n created_at: itemObj.getString('created_at') ?? '',\r\n updated_at: itemObj.getString('updated_at') ?? ''\r\n }\r\n result.push(addr)\r\n }\r\n \r\n __f__('log','at utils/supabaseService.uts:2971','[getAddresses] 返回地址数量:', result.length)\r\n return result\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:2974','[getAddresses] 获取地址异常:', error)\r\n return []\r\n }\r\n }\r\n\r\n // 根据ID获取地址详情\r\n async getAddressById(addressId: string): Promise {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('warn','at utils/supabaseService.uts:2983','用户未登录,无法获取地址')\r\n return null\r\n }\r\n\r\n try {\r\n const query = supa\r\n .from('ml_user_addresses')\r\n .select('*, recipient_name:receiver_name, phone:receiver_phone, detail_address:address_detail')\r\n .eq('id', addressId)\r\n .eq('user_id', userId)\r\n .single()\r\n \r\n const response = await query.execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:2998','获取地址详情失败:', response.error)\r\n return null\r\n }\r\n \r\n return response.data as UserAddress\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:3004','获取地址详情异常:', error)\r\n return null\r\n }\r\n }\r\n\r\n // 添加新地址\r\n async addAddress(address: AddAddressParams): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('error','at utils/supabaseService.uts:3014','用户未登录,无法添加地址')\r\n return false\r\n }\r\n\r\n // 如果设置为默认地址,需要先取消其他默认地址\r\n if (address.is_default == true) {\r\n await this.clearDefaultAddress(userId)\r\n }\r\n\r\n const response = await supa\r\n .from('ml_user_addresses')\r\n .insert({\r\n user_id: userId,\r\n receiver_name: address.recipient_name,\r\n receiver_phone: address.phone,\r\n province: address.province,\r\n city: address.city,\r\n district: address.district,\r\n address_detail: address.detail_address,\r\n postal_code: address.postal_code ?? null,\r\n is_default: address.is_default ?? false,\r\n created_at: new Date().toISOString(),\r\n updated_at: new Date().toISOString()\r\n })\r\n .execute()\r\n\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:3041','添加地址失败:', response.error)\r\n return false\r\n }\r\n\r\n return true\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:3047','添加地址异常:', error)\r\n return false\r\n }\r\n }\r\n\r\n // 更新地址\r\n async updateAddress(addressId: string, address: UpdateAddressParams): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('error','at utils/supabaseService.uts:3057','用户未登录,无法更新地址')\r\n return false\r\n }\r\n\r\n // 如果设置为默认地址,需要先取消其他默认地址\r\n if (address.is_default == true) {\r\n await this.clearDefaultAddress(userId)\r\n }\r\n \r\n // 构造更新数据,映射字段名到数据库列名\r\n const updateData = {}\r\n if (address.recipient_name != null) updateData['receiver_name'] = address.recipient_name\r\n if (address.phone != null) updateData['receiver_phone'] = address.phone\r\n if (address.province != null) updateData['province'] = address.province\r\n if (address.city != null) updateData['city'] = address.city\r\n if (address.district != null) updateData['district'] = address.district\r\n if (address.detail_address != null) updateData['address_detail'] = address.detail_address\r\n if (address.postal_code != null) updateData['postal_code'] = address.postal_code\r\n if (address.is_default != null) updateData['is_default'] = address.is_default\r\n if (address.label != null) updateData['label'] = address.label\r\n updateData['updated_at'] = new Date().toISOString()\r\n\r\n const response = await supa\r\n .from('ml_user_addresses')\r\n .update(updateData)\r\n .eq('id', addressId)\r\n .eq('user_id', userId)\r\n .execute()\r\n\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:3087','更新地址失败:', response.error)\r\n return false\r\n }\r\n\r\n return true\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:3093','更新地址异常:', error)\r\n return false\r\n }\r\n }\r\n \r\n // 确认收货\r\n async confirmReceipt(orderId: string): Promise {\r\n __f__('log','at utils/supabaseService.uts:3100','[confirmReceipt] 开始确认收货, orderId:', orderId)\r\n try {\r\n const userId = this.getCurrentUserId()\r\n __f__('log','at utils/supabaseService.uts:3103','[confirmReceipt] userId:', userId)\r\n if (userId == null) {\r\n return { success: false, error: '用户未登录' }\r\n }\r\n\r\n const updateData = new UTSJSONObject()\r\n updateData.set('order_status', 4)\r\n updateData.set('delivered_at', new Date().toISOString())\r\n updateData.set('completed_at', new Date().toISOString())\r\n updateData.set('updated_at', new Date().toISOString())\r\n \r\n __f__('log','at utils/supabaseService.uts:3114','[confirmReceipt] 准备更新订单状态, updateData:', JSON.stringify(updateData))\r\n\r\n const response = await supa\r\n .from('ml_orders')\r\n .update(updateData)\r\n .eq('id', orderId)\r\n .eq('user_id', userId)\r\n .execute()\r\n \r\n __f__('log','at utils/supabaseService.uts:3123','[confirmReceipt] response.status:', response.status)\r\n __f__('log','at utils/supabaseService.uts:3124','[confirmReceipt] response.error:', response.error)\r\n __f__('log','at utils/supabaseService.uts:3125','[confirmReceipt] response.data:', JSON.stringify(response.data))\r\n \r\n // 检查 HTTP 状态码\r\n if (response.status != null && response.status >= 400) {\r\n // 尝试从 response.data 中提取错误信息\r\n let errorMsg = '请求失败'\r\n if (response.data != null) {\r\n try {\r\n const errorData = response.data as UTSJSONObject\r\n const msg = errorData.getString('message')\r\n if (msg != null) {\r\n errorMsg = msg\r\n }\r\n } catch (e) {\r\n // ignore\r\n }\r\n }\r\n __f__('log','at utils/supabaseService.uts:3142','[confirmReceipt] HTTP错误:', response.status, errorMsg)\r\n return { success: false, error: errorMsg }\r\n }\r\n \r\n if (response.error != null) {\r\n return { success: false, error: response.error.message }\r\n }\r\n \r\n // 检查 response.data 是否包含错误代码\r\n if (response.data != null) {\r\n try {\r\n const respData = response.data as UTSJSONObject\r\n const errorCode = respData.getString('code')\r\n if (errorCode != null) {\r\n const errorMsg = respData.getString('message') ?? '数据库错误'\r\n __f__('log','at utils/supabaseService.uts:3157','[confirmReceipt] 数据库错误:', errorCode, errorMsg)\r\n return { success: false, error: errorMsg }\r\n }\r\n } catch (e) {\r\n // ignore\r\n }\r\n }\r\n \r\n // 检查是否有数据被更新\r\n if (response.data == null || (Array.isArray(response.data) && response.data.length === 0)) {\r\n __f__('log','at utils/supabaseService.uts:3167','[confirmReceipt] 没有数据被更新,可能订单不存在或无权限')\r\n return { success: false, error: '订单不存在或无权限更新' }\r\n }\r\n \r\n __f__('log','at utils/supabaseService.uts:3171','[confirmReceipt] 确认收货成功')\r\n return { success: true }\r\n } catch (e: any) {\r\n __f__('error','at utils/supabaseService.uts:3174','[confirmReceipt] 异常:', e)\r\n return { success: false, error: e.message }\r\n }\r\n }\r\n\r\n // 取消订单\r\n async cancelOrder(orderId: string): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n return false\r\n }\r\n\r\n const response = await supa\r\n .from('ml_orders')\r\n .update({\r\n order_status: 5,\r\n updated_at: new Date().toISOString()\r\n })\r\n .eq('id', orderId)\r\n .eq('user_id', userId)\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:3198','取消订单失败:', response.error)\r\n return false\r\n }\r\n \r\n return true\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:3204','取消订单异常:', e)\r\n return false\r\n }\r\n }\r\n\r\n // 删除订单\r\n async deleteOrder(orderId: string): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n return false\r\n }\r\n\r\n const response = await supa\r\n .from('ml_orders')\r\n .delete()\r\n .eq('id', orderId)\r\n .eq('user_id', userId)\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:3225','删除订单失败:', response.error)\r\n return false\r\n }\r\n \r\n return true\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:3231','删除订单异常:', e)\r\n return false\r\n }\r\n }\r\n\r\n // 确认收货\r\n async confirmOrderReceived(orderId: string): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n return false\r\n }\r\n\r\n const response = await supa\r\n .from('ml_orders')\r\n .update({\r\n order_status: 4,\r\n shipping_status: 3,\r\n updated_at: new Date().toISOString()\r\n })\r\n .eq('id', orderId)\r\n .eq('user_id', userId)\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:3256','确认收货失败:', response.error)\r\n return false\r\n }\r\n \r\n return true\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:3262','确认收货异常:', e)\r\n return false\r\n }\r\n }\r\n\r\n // 删除地址\r\n async deleteAddress(addressId: string): Promise {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:3270','正在执行删除地址,ID:', addressId)\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('error','at utils/supabaseService.uts:3273','用户未登录,无法删除地址')\r\n return false\r\n }\r\n\r\n const response = await supa\r\n .from('ml_user_addresses')\r\n .eq('id', addressId)\r\n .eq('user_id', userId)\r\n .delete()\r\n .execute()\r\n\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:3285','删除地址失败:', response.error)\r\n return false\r\n }\r\n\r\n return true\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:3291','删除地址异常:', error)\r\n return false\r\n }\r\n }\r\n\r\n // 清除默认地址(内部使用)\r\n private async clearDefaultAddress(userId: string): Promise {\r\n try {\r\n await supa\r\n .from('ml_user_addresses')\r\n .update({\r\n is_default: false,\r\n updated_at: new Date().toISOString()\r\n })\r\n .eq('user_id', userId)\r\n .eq('is_default', true)\r\n .execute()\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:3309','清除默认地址异常:', error)\r\n }\r\n }\r\n\r\n // 获取用户资料\r\n async getUserProfile(): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return null\r\n \r\n // 联合查询 auth user 和 profile\r\n // 由于 Supabase auth table 不可直接访问,这里查询 ml_user_profiles\r\n // 注意:使用 limit(1) 替代 single() 以避免 Android 端类型转换错误\r\n const response = await supa\r\n .from('ml_user_profiles')\r\n .select('*')\r\n .eq('user_id', userId)\r\n .limit(1)\r\n .execute()\r\n \r\n if (response.error != null) {\r\n // 如果不存在 profile,可能只有 auth user,这里暂时返回空或创建默认\r\n return null\r\n }\r\n \r\n const rawData = response.data\r\n if (rawData == null) return null\r\n \r\n // 作为数组处理\r\n const rawList = rawData as any[]\r\n if (rawList.length == 0) return null\r\n \r\n return rawList[0]\r\n } catch (e) {\r\n return null\r\n }\r\n }\r\n \r\n // 创建订单\r\n async createOrder(orderData: CreateOrderParams): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('error','at utils/supabaseService.uts:3352','CreateOrder: User not logged in')\r\n return null\r\n }\r\n \r\n const orderNo = 'ML' + Date.now() + Math.floor(Math.random() * 1000)\r\n \r\n let merchantId = orderData.merchant_id\r\n __f__('log','at utils/supabaseService.uts:3359','[CreateOrder] 原始 merchant_id:', merchantId)\r\n if (merchantId == null || merchantId == '' || merchantId == 'unknown') {\r\n __f__('warn','at utils/supabaseService.uts:3361','[CreateOrder] merchant_id 为空或无效,将使用 userId 作为 fallback')\r\n merchantId = userId\r\n }\r\n __f__('log','at utils/supabaseService.uts:3364','[CreateOrder] 最终使用的 merchant_id:', merchantId)\r\n \r\n let shippingAddrStr = '{}'\r\n if (orderData.shipping_address != null) {\r\n if (typeof orderData.shipping_address === 'string') {\r\n shippingAddrStr = orderData.shipping_address\r\n } else {\r\n shippingAddrStr = JSON.stringify(orderData.shipping_address)\r\n }\r\n }\r\n \r\n const orderPayload = new UTSJSONObject()\r\n orderPayload.set('user_id', userId)\r\n orderPayload.set('merchant_id', merchantId)\r\n orderPayload.set('order_no', orderNo)\r\n orderPayload.set('product_amount', orderData.product_amount)\r\n orderPayload.set('shipping_fee', orderData.shipping_fee)\r\n orderPayload.set('total_amount', orderData.total_amount)\r\n orderPayload.set('paid_amount', 0)\r\n orderPayload.set('shipping_address', shippingAddrStr)\r\n orderPayload.set('order_status', 1)\r\n orderPayload.set('payment_status', 1)\r\n orderPayload.set('shipping_status', 1)\r\n orderPayload.set('created_at', new Date().toISOString())\r\n orderPayload.set('updated_at', new Date().toISOString())\r\n \r\n __f__('log','at utils/supabaseService.uts:3390','[CreateOrder] 插入订单数据:', JSON.stringify(orderPayload))\r\n __f__('log','at utils/supabaseService.uts:3391','[CreateOrder] 期望的订单号:', orderNo)\r\n \r\n const orderResponse = await supa\r\n .from('ml_orders')\r\n .insert(orderPayload)\r\n .execute()\r\n \r\n __f__('log','at utils/supabaseService.uts:3398','[CreateOrder] insert 完成')\r\n __f__('log','at utils/supabaseService.uts:3399','[CreateOrder] orderResponse.error:', orderResponse.error)\r\n \r\n if (orderResponse.error != null) {\r\n __f__('error','at utils/supabaseService.uts:3402','[CreateOrder] 创建订单失败:', orderResponse.error)\r\n return null\r\n }\r\n \r\n __f__('log','at utils/supabaseService.uts:3406','[CreateOrder] 开始查询新创建的订单, order_no:', orderNo)\r\n \r\n const queryResponse = await supa\r\n .from('ml_orders')\r\n .select('id, order_no')\r\n .eq('order_no', orderNo)\r\n .execute()\r\n \r\n __f__('log','at utils/supabaseService.uts:3414','[CreateOrder] queryResponse.error:', queryResponse.error)\r\n __f__('log','at utils/supabaseService.uts:3415','[CreateOrder] queryResponse.data:', JSON.stringify(queryResponse.data))\r\n \r\n if (queryResponse.error != null) {\r\n __f__('error','at utils/supabaseService.uts:3418','[CreateOrder] 查询订单失败:', queryResponse.error)\r\n return null\r\n }\r\n \r\n const queryData = queryResponse.data as any\r\n let orderId = ''\r\n \r\n __f__('log','at utils/supabaseService.uts:3425','[CreateOrder] queryData 类型:', typeof queryData, '是否数组:', Array.isArray(queryData))\r\n \r\n if (Array.isArray(queryData) && queryData.length > 0) {\r\n __f__('log','at utils/supabaseService.uts:3428','[CreateOrder] queryData 长度:', queryData.length)\r\n const firstItemRaw = queryData[0]\r\n __f__('log','at utils/supabaseService.uts:3430','[CreateOrder] firstItemRaw 类型:', typeof firstItemRaw)\r\n \r\n // 将 firstItemRaw 转换为可访问的对象\r\n const firstItemStr = JSON.stringify(firstItemRaw)\r\n const firstItemParsed = JSON.parse(firstItemStr)\r\n if (firstItemParsed == null) {\r\n __f__('error','at utils/supabaseService.uts:3436','[CreateOrder] 解析订单数据失败')\r\n return null\r\n }\r\n const firstItem = firstItemParsed as UTSJSONObject\r\n orderId = (firstItem.getString('id') ?? '') as string\r\n __f__('log','at utils/supabaseService.uts:3441','[CreateOrder] 找到新创建的订单, id:', orderId)\r\n } else {\r\n __f__('error','at utils/supabaseService.uts:3443','[CreateOrder] 未找到新创建的订单,插入可能失败')\r\n return null\r\n }\r\n \r\n __f__('log','at utils/supabaseService.uts:3447','[CreateOrder] 订单创建成功, orderId:', orderId)\r\n \r\n const orderItems: UTSJSONObject[] = []\r\n __f__('log','at utils/supabaseService.uts:3450','[CreateOrder] orderData.items 类型:', typeof orderData.items, '是否数组:', Array.isArray(orderData.items))\r\n \r\n if (orderData.items == null) {\r\n __f__('error','at utils/supabaseService.uts:3453','[CreateOrder] orderData.items 为 null!')\r\n return orderId\r\n }\r\n \r\n const rawItems = orderData.items as any[]\r\n __f__('log','at utils/supabaseService.uts:3458','[CreateOrder] rawItems 长度:', rawItems.length)\r\n \r\n if (rawItems.length === 0) {\r\n __f__('warn','at utils/supabaseService.uts:3461','[CreateOrder] rawItems 为空数组,没有商品项需要插入')\r\n return orderId\r\n }\r\n \r\n for(let i = 0; i < rawItems.length; i++) {\r\n const rawItem = rawItems[i]\r\n const itemStr = JSON.stringify(rawItem)\r\n const itemParsed = JSON.parse(itemStr)\r\n if (itemParsed == null) {\r\n __f__('error','at utils/supabaseService.uts:3470','[CreateOrder] 商品项解析失败')\r\n continue\r\n }\r\n const item = itemParsed as UTSJSONObject\r\n\r\n const itemJson = new UTSJSONObject()\r\n \r\n let pId = item.get('product_id')\r\n if (pId == null) {\r\n pId = item.get('id')\r\n }\r\n const productId = (pId ?? '') as string\r\n \r\n itemJson.set('order_id', orderId)\r\n itemJson.set('product_id', productId)\r\n \r\n const skuIdVal = item.get('sku_id')\r\n if (skuIdVal != null && skuIdVal !== '') {\r\n itemJson.set('sku_id', skuIdVal as string)\r\n }\r\n \r\n const productName = (item.get('product_name') ?? '') as string\r\n itemJson.set('product_name', productName)\r\n \r\n const sName = item.get('sku_name')\r\n itemJson.set('sku_name', (sName ?? '') as string)\r\n \r\n const specVal = item.get('specifications')\r\n let skuSnapshot = '{}'\r\n if (specVal != null) {\r\n if (typeof specVal === 'string') {\r\n skuSnapshot = specVal as string\r\n } else {\r\n skuSnapshot = JSON.stringify(specVal)\r\n }\r\n }\r\n itemJson.set('sku_snapshot', skuSnapshot)\r\n itemJson.set('specifications', skuSnapshot)\r\n \r\n const img1 = item.get('product_image')\r\n const img2 = item.get('image_url')\r\n let imgUrl = ((img1 ?? img2 ?? '') as string)\r\n while (imgUrl.indexOf('`') >= 0) {\r\n imgUrl = imgUrl.replace('`', '')\r\n }\r\n itemJson.set('image_url', imgUrl)\r\n\r\n const iPriceRaw = item.getNumber('price') ?? 0\r\n const iMemberPrice = item.getNumber('member_price') ?? 0\r\n // 优先使用会员价\r\n const iPrice = (iMemberPrice > 0 && iMemberPrice < iPriceRaw) ? iMemberPrice : iPriceRaw\r\n const iQty = item.getNumber('quantity') ?? 1\r\n itemJson.set('price', iPrice)\r\n itemJson.set('quantity', iQty)\r\n itemJson.set('total_amount', iPrice * iQty)\r\n itemJson.set('created_at', new Date().toISOString())\r\n \r\n orderItems.push(itemJson)\r\n }\r\n \r\n __f__('log','at utils/supabaseService.uts:3530','[CreateOrder] 插入订单项数量:', orderItems.length)\r\n \r\n for (let j: number = 0; j < orderItems.length; j++) {\r\n __f__('log','at utils/supabaseService.uts:3533','[CreateOrder] 开始插入订单项', j)\r\n const itemJson = orderItems[j]\r\n // 将 UTSJSONObject 转换为普通对象\r\n __f__('log','at utils/supabaseService.uts:3536','[CreateOrder] 序列化订单项...')\r\n const itemObjStr = JSON.stringify(itemJson)\r\n __f__('log','at utils/supabaseService.uts:3538','[CreateOrder] 订单项 JSON:', itemObjStr)\r\n const itemObjParsed = JSON.parse(itemObjStr)\r\n __f__('log','at utils/supabaseService.uts:3540','[CreateOrder] itemObjParsed 类型:', typeof itemObjParsed)\r\n if (itemObjParsed == null) {\r\n __f__('error','at utils/supabaseService.uts:3542','[CreateOrder] 订单项转换失败')\r\n continue\r\n }\r\n \r\n // 使用 UTSJSONObject 而不是 Record\r\n const itemObj = itemObjParsed as UTSJSONObject\r\n __f__('log','at utils/supabaseService.uts:3548','[CreateOrder] 执行 insert...')\r\n \r\n const itemsResponse = await supa\r\n .from('ml_order_items')\r\n .insert(itemObj)\r\n .execute()\r\n \r\n __f__('log','at utils/supabaseService.uts:3555','[CreateOrder] insert 完成, error:', itemsResponse.error) \r\n if (itemsResponse.error != null) {\r\n __f__('error','at utils/supabaseService.uts:3557','[CreateOrder] 创建订单项失败:', itemsResponse.error)\r\n }\r\n }\r\n \r\n __f__('log','at utils/supabaseService.uts:3561','[CreateOrder] 订单项创建成功')\r\n \r\n const cartItemIds: string[] = []\r\n for(let i = 0; i < rawItems.length; i++) {\r\n const rawItem = rawItems[i]\r\n const itemParsed = JSON.parse(JSON.stringify(rawItem))\r\n if (itemParsed == null) continue\r\n const item = itemParsed as UTSJSONObject\r\n const iid = item.getString('id')\r\n if (iid != null && iid.length > 10) {\r\n cartItemIds.push(iid)\r\n }\r\n }\r\n \r\n if (cartItemIds.length > 0) {\r\n await this.batchDeleteCartItems(cartItemIds)\r\n }\r\n \r\n return orderId\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:3581','[CreateOrder] 创建订单异常:', error)\r\n return null\r\n }\r\n }\r\n\r\n // 批量通过店铺创建订单\r\n async createOrdersByShop(params: ShopOrderParams): Promise {\r\n try {\r\n const orderIds: string[] = []\r\n const groups = params.shopGroups as any[]\r\n \r\n let grandTotal = 0.0\r\n for(let k = 0; k < groups.length; k++) {\r\n const g = JSON.parse(JSON.stringify(groups[k])) as UTSJSONObject\r\n const gItemsRaw = g.get('items')\r\n if (gItemsRaw == null) continue\r\n const gItems = gItemsRaw as any[]\r\n \r\n for(let gi = 0; gi < gItems.length; gi++) {\r\n const it = JSON.parse(JSON.stringify(gItems[gi])) as UTSJSONObject\r\n // 优先使用会员价\r\n let itPrice = it.getNumber('price') ?? 0\r\n const itMemberPrice = it.getNumber('member_price') ?? 0\r\n if (itMemberPrice > 0 && itMemberPrice < itPrice) {\r\n itPrice = itMemberPrice\r\n }\r\n const itQty = it.getNumber('quantity') ?? 1\r\n grandTotal += itPrice * itQty\r\n }\r\n }\r\n \r\n // 为每个店铺创建一个订单\r\n for (let i = 0; i < groups.length; i++) {\r\n const group = JSON.parse(JSON.stringify(groups[i])) as UTSJSONObject\r\n const shopItemsRaw = group.get('items')\r\n if (shopItemsRaw == null) continue\r\n const shopItems = shopItemsRaw as any[]\r\n \r\n let productAmount = 0.0\r\n for(let j = 0; j < shopItems.length; j++) {\r\n const sItem = JSON.parse(JSON.stringify(shopItems[j])) as UTSJSONObject\r\n // 优先使用会员价\r\n let siPrice = sItem.getNumber('price') ?? 0\r\n const siMemberPrice = sItem.getNumber('member_price') ?? 0\r\n if (siMemberPrice > 0 && siMemberPrice < siPrice) {\r\n siPrice = siMemberPrice\r\n }\r\n const siQty = sItem.getNumber('quantity') ?? 1\r\n productAmount += siPrice * siQty\r\n }\r\n \r\n // 简单平摊运费和优惠 (实际逻辑可能更复杂)\r\n const ratio = grandTotal > 0 ? (productAmount / grandTotal) : 0\r\n const shopShippingFee = params.deliveryFee * ratio\r\n const shopDiscount = params.discountAmount * ratio\r\n const shopTotal = productAmount + shopShippingFee - shopDiscount\r\n \r\n const mId = group.getString('merchant_id')\r\n const sId = group.getString('shopId')\r\n const shopName = group.getString('shopName')\r\n\r\n __f__('log','at utils/supabaseService.uts:3642','[createOrdersByShop] 店铺组信息:', {\r\n merchant_id: mId,\r\n shopId: sId,\r\n shopName: shopName\r\n })\r\n\r\n const finalMerchantId = (mId != null && mId != '') ? mId : (sId ?? '')\r\n __f__('log','at utils/supabaseService.uts:3649','[createOrdersByShop] 最终使用的 merchant_id:', finalMerchantId)\r\n \r\n // 将 shopItems 转换为普通对象数组\r\n const plainItems: any[] = []\r\n for(let k = 0; k < shopItems.length; k++) {\r\n const plainItemRaw = JSON.parse(JSON.stringify(shopItems[k]))\r\n if (plainItemRaw != null) {\r\n plainItems.push(plainItemRaw as any)\r\n }\r\n }\r\n __f__('log','at utils/supabaseService.uts:3659','[createOrdersByShop] plainItems 数量:', plainItems.length)\r\n\r\n const orderId = await this.createOrder({\r\n merchant_id: finalMerchantId,\r\n product_amount: productAmount,\r\n shipping_fee: shopShippingFee,\r\n total_amount: shopTotal,\r\n shipping_address: params.shipping_address,\r\n items: plainItems\r\n })\r\n \r\n if (orderId != null) {\r\n orderIds.push(orderId)\r\n } else {\r\n return { success: false, orderIds, error: `店铺 ${shopName} 订单创建失败` }\r\n }\r\n }\r\n \r\n return { success: true, orderIds }\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:3679','批量创建订单异常:', e)\r\n return { success: false, orderIds: [], error: '系统异常' }\r\n }\r\n }\r\n\r\n // 获取订单列表\r\n async getOrders(status: number = 0): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n \r\n // 关联查询店铺表获取店铺名称\r\n let query = supa\r\n .from('ml_orders')\r\n .select('*, ml_order_items(*), ml_shops(shop_name)')\r\n .eq('user_id', userId)\r\n .order('created_at', { ascending: false })\r\n \r\n if (status > 0) {\r\n query = query.eq('order_status', status)\r\n }\r\n \r\n const response = await query.execute()\r\n \r\n __f__('log','at utils/supabaseService.uts:3706','[getOrders] response.error:', response.error)\r\n if (response.data != null && Array.isArray(response.data)) {\r\n __f__('log','at utils/supabaseService.uts:3708','[getOrders] 订单数量:', response.data.length)\r\n }\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:3712','获取订单列表失败:', response.error)\r\n const empty: any[] = []\r\n return empty\r\n }\r\n \r\n const data = response.data\r\n if (data == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n \r\n // 修复订单项中的图片URL\r\n const orders = data as any[]\r\n for (let i = 0; i < orders.length; i++) {\r\n const order = orders[i]\r\n const orderStr = JSON.stringify(order)\r\n const orderObj = JSON.parse(orderStr) as UTSJSONObject\r\n const itemsRaw = orderObj.get('ml_order_items')\r\n if (itemsRaw != null && Array.isArray(itemsRaw)) {\r\n const items = itemsRaw as any[]\r\n for (let j = 0; j < items.length; j++) {\r\n const item = items[j]\r\n const itemStr = JSON.stringify(item)\r\n const itemObj = JSON.parse(itemStr) as UTSJSONObject\r\n const imgUrl = itemObj.getString('image_url')\r\n if (imgUrl != null) {\r\n itemObj['image_url'] = fixImageUrl(imgUrl)\r\n }\r\n const prodImg = itemObj.getString('product_image')\r\n if (prodImg != null) {\r\n itemObj['product_image'] = fixImageUrl(prodImg)\r\n }\r\n items[j] = itemObj\r\n }\r\n orderObj['ml_order_items'] = items\r\n orders[i] = orderObj\r\n }\r\n }\r\n \r\n return orders\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:3753','获取订单列表异常:', error)\r\n const empty: any[] = []\r\n return empty\r\n }\r\n }\r\n \r\n // 获取订单详情\r\n async getOrderDetail(orderId: string): Promise {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:3762','[getOrderDetail] 开始获取订单详情,orderId:', orderId)\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return null\r\n \r\n const response = await supa\r\n .from('ml_orders')\r\n .select('*, ml_order_items(*)')\r\n .eq('id', orderId)\r\n .eq('user_id', userId!)\r\n .limit(1)\r\n .execute()\r\n \r\n __f__('log','at utils/supabaseService.uts:3774','[getOrderDetail] response.error:', response.error)\r\n __f__('log','at utils/supabaseService.uts:3775','[getOrderDetail] response.data:', JSON.stringify(response.data))\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:3778','[getOrderDetail] 获取订单详情失败:', response.error)\r\n return null\r\n }\r\n \r\n const rawData = response.data\r\n if (rawData == null) {\r\n __f__('log','at utils/supabaseService.uts:3784','[getOrderDetail] 数据为空')\r\n return null\r\n }\r\n \r\n const rawList = rawData as any[]\r\n if (rawList.length == 0) {\r\n __f__('log','at utils/supabaseService.uts:3790','[getOrderDetail] 未找到订单')\r\n return null\r\n }\r\n \r\n const orderData = rawList[0]\r\n __f__('log','at utils/supabaseService.uts:3795','[getOrderDetail] 成功获取订单')\r\n \r\n const orderObj = JSON.parse(JSON.stringify(orderData)) as UTSJSONObject\r\n \r\n const result = new UTSJSONObject()\r\n result.set('id', orderObj.get('id') ?? '')\r\n result.set('order_no', orderObj.get('order_no') ?? '')\r\n result.set('order_status', orderObj.get('order_status') ?? 1)\r\n result.set('user_id', orderObj.get('user_id') ?? '')\r\n result.set('merchant_id', orderObj.get('merchant_id') ?? '')\r\n result.set('product_amount', orderObj.get('product_amount') ?? 0)\r\n result.set('shipping_fee', orderObj.get('shipping_fee') ?? 0)\r\n result.set('total_amount', orderObj.get('total_amount') ?? 0)\r\n result.set('paid_amount', orderObj.get('paid_amount') ?? 0)\r\n result.set('discount_amount', orderObj.get('discount_amount') ?? 0)\r\n result.set('payment_method', orderObj.get('payment_method') ?? '')\r\n result.set('payment_status', orderObj.get('payment_status') ?? 1)\r\n result.set('shipping_status', orderObj.get('shipping_status') ?? 1)\r\n result.set('created_at', orderObj.get('created_at') ?? '')\r\n result.set('paid_at', orderObj.get('paid_at') ?? '')\r\n result.set('shipped_at', orderObj.get('shipped_at') ?? '')\r\n result.set('completed_at', orderObj.get('completed_at') ?? '')\r\n result.set('shipping_address', orderObj.get('shipping_address'))\r\n result.set('ml_order_items', orderObj.get('ml_order_items'))\r\n // 添加物流信息\r\n result.set('tracking_no', orderObj.get('tracking_no') ?? '')\r\n result.set('carrier_name', orderObj.get('carrier_name') ?? '')\r\n result.set('delivered_at', orderObj.get('delivered_at') ?? '')\r\n \r\n return result\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:3826','[getOrderDetail] 获取订单详情异常:', e)\r\n return null\r\n }\r\n }\r\n\r\n // 支付订单\r\n async payOrder(orderId: string, paymentMethod: string, amount: number): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('error','at utils/supabaseService.uts:3836','[payOrder] 用户未登录')\r\n return false\r\n }\r\n \r\n __f__('log','at utils/supabaseService.uts:3840','[payOrder] 开始更新订单状态, orderId:', orderId, 'userId:', userId)\r\n \r\n const updatePayload = new UTSJSONObject()\r\n updatePayload.set('order_status', 2)\r\n updatePayload.set('payment_status', 1)\r\n updatePayload.set('payment_method', paymentMethod)\r\n updatePayload.set('payment_time', new Date().toISOString())\r\n updatePayload.set('paid_amount', amount)\r\n updatePayload.set('updated_at', new Date().toISOString())\r\n \r\n __f__('log','at utils/supabaseService.uts:3850','[payOrder] 更新数据:', JSON.stringify(updatePayload))\r\n \r\n const response = await supa\r\n .from('ml_orders')\r\n .update(updatePayload)\r\n .eq('id', orderId)\r\n .eq('user_id', userId)\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:3860','[payOrder] 更新订单失败:', response.error)\r\n return false\r\n }\r\n \r\n __f__('log','at utils/supabaseService.uts:3864','[payOrder] 订单状态更新成功')\r\n\r\n if (paymentMethod === 'balance') {\r\n __f__('log','at utils/supabaseService.uts:3867','[payOrder] 余额支付,暂不扣减余额')\r\n }\r\n\r\n return true\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:3872','[payOrder] 支付异常:', e)\r\n return false\r\n }\r\n }\r\n\r\n // 根据ID获取订单信息\r\n async getOrderById(orderId: string): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('error','at utils/supabaseService.uts:3882','[getOrderById] 用户未登录')\r\n return null\r\n }\r\n \r\n __f__('log','at utils/supabaseService.uts:3886','[getOrderById] 查询订单, orderId:', orderId)\r\n \r\n const response = await supa\r\n .from('ml_orders')\r\n .select('*')\r\n .eq('id', orderId)\r\n .eq('user_id', userId)\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:3896','[getOrderById] 查询订单失败:', response.error)\r\n return null\r\n }\r\n \r\n const data = response.data as any[]\r\n if (data == null || data.length === 0) {\r\n __f__('log','at utils/supabaseService.uts:3902','[getOrderById] 未找到订单')\r\n return null\r\n }\r\n \r\n const orderRaw = data[0]\r\n let orderObj: UTSJSONObject\r\n if (orderRaw instanceof UTSJSONObject) {\r\n orderObj = orderRaw as UTSJSONObject\r\n } else {\r\n orderObj = JSON.parse(JSON.stringify(orderRaw)) as UTSJSONObject\r\n }\r\n \r\n __f__('log','at utils/supabaseService.uts:3914','[getOrderById] 订单数据:', JSON.stringify(orderObj))\r\n return orderObj\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:3917','[getOrderById] 查询异常:', e)\r\n return null\r\n }\r\n }\r\n\r\n // 提交售后申请\r\n async createRefund(data: any): Promise {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:3925','[createRefund] 开始处理退款申请')\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('log','at utils/supabaseService.uts:3928','[createRefund] 用户未登录')\r\n return { success: false, message: '请先登录' }\r\n }\r\n \r\n const d = JSON.parse(JSON.stringify(data)) as UTSJSONObject\r\n const orderId = d.getString('order_id') ?? ''\r\n const refundType = d.getNumber('refund_type')\r\n const refundReason = d.getString('refund_reason')\r\n const refundAmount = d.getNumber('refund_amount')\r\n const description = d.getString('description')\r\n const images = d.getArray('images')\r\n \r\n __f__('log','at utils/supabaseService.uts:3940','[createRefund] orderId:', orderId)\r\n __f__('log','at utils/supabaseService.uts:3941','[createRefund] refundType:', refundType)\r\n __f__('log','at utils/supabaseService.uts:3942','[createRefund] refundReason:', refundReason)\r\n __f__('log','at utils/supabaseService.uts:3943','[createRefund] refundAmount:', refundAmount)\r\n\r\n const payload = {\r\n user_id: userId,\r\n order_id: orderId,\r\n refund_no: 'REF' + Date.now() + Math.floor(Math.random() * 1000),\r\n refund_type: refundType,\r\n refund_reason: refundReason,\r\n refund_amount: refundAmount,\r\n description: description ?? '',\r\n images: images ?? ([] as any[]),\r\n status: 1 // Pending\r\n }\r\n \r\n __f__('log','at utils/supabaseService.uts:3957','[createRefund] 准备插入 ml_refunds')\r\n const response = await supa\r\n .from('ml_refunds')\r\n .insert(payload)\r\n .execute()\r\n \r\n __f__('log','at utils/supabaseService.uts:3963','[createRefund] insert response.error:', response.error)\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:3966','提交售后失败:', response.error)\r\n return { success: false, message: '提交失败: ' + (response.error.message ?? '未知错误') }\r\n }\r\n \r\n __f__('log','at utils/supabaseService.uts:3970','[createRefund] 插入成功,更新订单状态')\r\n // 更新订单状态为退款中\r\n const updateResponse = await supa\r\n .from('ml_orders')\r\n .update({\r\n order_status: 6, // 退款中\r\n updated_at: new Date().toISOString()\r\n })\r\n .eq('id', orderId)\r\n .execute()\r\n \r\n __f__('log','at utils/supabaseService.uts:3981','[createRefund] update response.error:', updateResponse.error)\r\n \r\n if (updateResponse.error != null) {\r\n __f__('error','at utils/supabaseService.uts:3984','更新订单状态失败:', updateResponse.error)\r\n // 不影响退款申请结果,只记录错误\r\n }\r\n \r\n __f__('log','at utils/supabaseService.uts:3988','[createRefund] 完成,返回成功')\r\n return { success: true, message: '申请提交成功' }\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:3991','提交售后异常:', e)\r\n return { success: false, message: '系统异常' }\r\n }\r\n }\r\n\r\n // 取消退款申请\r\n async cancelRefund(orderId: string): Promise {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:3999','[cancelRefund] 开始取消退款申请, orderId:', orderId)\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n return { success: false, message: '请先登录' }\r\n }\r\n \r\n // 更新退款记录状态为已取消\r\n const refundUpdateResponse = await supa\r\n .from('ml_refunds')\r\n .update({\r\n status: 4, // 已取消\r\n updated_at: new Date().toISOString()\r\n })\r\n .eq('order_id', orderId)\r\n .eq('user_id', userId)\r\n .eq('status', 1) // 只能取消待处理的退款\r\n .execute()\r\n \r\n if (refundUpdateResponse.error != null) {\r\n __f__('error','at utils/supabaseService.uts:4018','取消退款记录失败:', refundUpdateResponse.error)\r\n return { success: false, message: '取消失败: ' + (refundUpdateResponse.error.message ?? '未知错误') }\r\n }\r\n \r\n // 恢复订单状态为已完成(假设之前是已完成状态)\r\n const orderUpdateResponse = await supa\r\n .from('ml_orders')\r\n .update({\r\n order_status: 4, // 已完成\r\n updated_at: new Date().toISOString()\r\n })\r\n .eq('id', orderId)\r\n .execute()\r\n \r\n if (orderUpdateResponse.error != null) {\r\n __f__('error','at utils/supabaseService.uts:4033','恢复订单状态失败:', orderUpdateResponse.error)\r\n // 不影响取消退款结果,只记录错误\r\n }\r\n \r\n return { success: true, message: '已取消退款申请' }\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:4039','取消退款异常:', e)\r\n return { success: false, message: '系统异常' }\r\n }\r\n }\r\n\r\n // 再次购买\r\n async rePurchase(order: any): Promise {\r\n try {\r\n // 将 order 转换为 UTSJSONObject 以安全访问属性\r\n const orderObj = JSON.parse(JSON.stringify(order)) as UTSJSONObject\r\n // 尝试获取 ml_order_items 或 items\r\n let itemsKey = 'ml_order_items'\r\n let itemsRaw = orderObj.get(itemsKey)\r\n \r\n if (itemsRaw == null) {\r\n itemsKey = 'items'\r\n itemsRaw = orderObj.get(itemsKey)\r\n }\r\n \r\n if (itemsRaw == null) return false\r\n \r\n // 断言为数组\r\n const items = itemsRaw as any[]\r\n if (items.length === 0) return false\r\n\r\n // 简单的循环添加,实际项目中可以优化为批量插入\r\n for (let i = 0; i < items.length; i++) {\r\n // 同样,item 也是 UTSJSONObject 或支持访问的对象\r\n const item = JSON.parse(JSON.stringify(items[i])) as UTSJSONObject\r\n const productId = item.getString('product_id') \r\n const skuId = item.getString('sku_id')\r\n // 数量可能是数字或字符串\r\n const quantity = item.getNumber('quantity') ?? 1\r\n \r\n if (productId != null) {\r\n await this.addToCart(productId, quantity, skuId ?? '', '')\r\n }\r\n }\r\n return true\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:4079','rePurchase error', e)\r\n return false\r\n }\r\n }\r\n\r\n // 申请售后 (Legacy/Simple update)\r\n async applyRefund(orderId: string, reason: string): Promise {\r\n try {\r\n // 更新订单状态为 退款中 (6)\r\n const response = await supa\r\n .from('ml_orders')\r\n .update({\r\n order_status: 6,\r\n cancel_reason: reason,\r\n updated_at: new Date().toISOString()\r\n })\r\n .eq('id', orderId)\r\n .execute()\r\n \r\n return response.error === null\r\n } catch (e) {\r\n return false\r\n }\r\n }\r\n\r\n // 获取售后记录列表\r\n async getRefunds(statusList: number[] = [], page: number = 1, pageSize: number = 10): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n let query = supa\r\n .from('ml_refunds')\r\n .select(`\r\n *,\r\n order:ml_orders!inner (\r\n order_no,\r\n created_at,\r\n ml_order_items (\r\n product_id,\r\n product_name,\r\n image_url\r\n )\r\n )\r\n `)\r\n .eq('user_id', userId)\r\n .order('created_at', { ascending: false })\r\n\r\n if (statusList.length > 0) {\r\n // 显式转换为 any[] 以匹配 .in 方法的参数要求\r\n const anyList = statusList as any[]\r\n query = query.in('status', anyList)\r\n }\r\n\r\n query = query.range((page - 1) * pageSize, page * pageSize - 1)\r\n\r\n const response = await query.execute()\r\n\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:4141','获取售后列表失败:', response.error)\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n const data = response.data\r\n if (data == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n return data\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:4154','获取售后列表异常:', e)\r\n const empty: any[] = []\r\n return empty\r\n }\r\n }\r\n\r\n async deleteRefund(refundId: string): Promise {\r\n try {\r\n const response = await supa\r\n .from('ml_refunds')\r\n .delete()\r\n .eq('id', refundId)\r\n .execute()\r\n\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:4169','删除退款记录失败:', response.error)\r\n return false\r\n }\r\n\r\n return true\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:4175','删除退款记录异常:', e)\r\n return false\r\n }\r\n }\r\n\r\n async getUserBalanceNumber(): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n __f__('log','at utils/supabaseService.uts:4183','[Supabase] getUserBalance userId:', userId)\r\n if (userId == null) return 0\r\n \r\n // 优先查 ml_user_wallets\r\n const walletRes = await supa\r\n .from('ml_user_wallets')\r\n .select('balance')\r\n .eq('user_id', userId!)\r\n .single()\r\n .execute()\r\n \r\n if (walletRes.error != null) {\r\n __f__('error','at utils/supabaseService.uts:4195','[Supabase] getUserBalance error:', walletRes.error)\r\n } else {\r\n __f__('log','at utils/supabaseService.uts:4197','[Supabase] getUserBalance data:', walletRes.data)\r\n }\r\n\r\n if (walletRes.error == null && walletRes.data != null) {\r\n let data = walletRes.data\r\n // 如果是数组,取第一项\r\n if (Array.isArray(data)) {\r\n const arr = data as any[]\r\n if (arr.length > 0) {\r\n data = arr[0]\r\n }\r\n }\r\n\r\n let val:number = 0\r\n if (data instanceof UTSJSONObject) {\r\n val = data.getNumber('balance') ?? 0\r\n // 尝试字符串转换,防止精度丢失导致转为string\r\n if (val === 0 && data.getString('balance') != null) {\r\n val = parseFloat(data.getString('balance')!)\r\n }\r\n return val\r\n } else {\r\n // 对于 Map 或 loose object\r\n const jsonObj = JSON.parse(JSON.stringify(data)) as UTSJSONObject\r\n val = jsonObj.getNumber('balance') ?? 0\r\n if (val === 0 && jsonObj.getString('balance') != null) {\r\n val = parseFloat(jsonObj.getString('balance')!)\r\n }\r\n return val\r\n }\r\n }\r\n\r\n __f__('log','at utils/supabaseService.uts:4229','[Supabase] Wallet table empty, checking profile...')\r\n\r\n // Fallback to profile\r\n const profile = await this.getUserProfile()\r\n if (profile != null) {\r\n if (profile instanceof UTSJSONObject) {\r\n return profile.getNumber('balance') ?? 0\r\n } else {\r\n const pObj = JSON.parse(JSON.stringify(profile)) as UTSJSONObject\r\n return pObj.getNumber('balance') ?? 0\r\n }\r\n }\r\n return 0\r\n } catch(e) {\r\n __f__('error','at utils/supabaseService.uts:4243','[Supabase] getUserBalance exception:', e)\r\n return 0\r\n }\r\n }\r\n \r\n // 获取用户积分\r\n async getUserPoints(): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n __f__('log','at utils/supabaseService.uts:4252','[Supabase] getUserPoints userId:', userId)\r\n if (userId == null) return 0\r\n \r\n // 查 ml_user_points\r\n const res = await supa\r\n .from('ml_user_points')\r\n .select('points')\r\n .eq('user_id', userId!)\r\n .single()\r\n .execute()\r\n \r\n if (res.error != null) {\r\n __f__('error','at utils/supabaseService.uts:4264','[Supabase] getUserPoints error:', res.error)\r\n } else {\r\n __f__('log','at utils/supabaseService.uts:4266','[Supabase] getUserPoints data:', res.data)\r\n }\r\n\r\n if (res.error == null && res.data != null) {\r\n let data = res.data\r\n // 如果是数组,取第一项\r\n if (Array.isArray(data)) {\r\n const arr = data as any[]\r\n if (arr.length > 0) {\r\n data = arr[0]\r\n }\r\n }\r\n\r\n if (data instanceof UTSJSONObject) {\r\n return data.getNumber('points') ?? 0\r\n } else {\r\n // 尝试转为 UTSJSONObject\r\n const jsonObj = JSON.parse(JSON.stringify(data)) as UTSJSONObject\r\n const val = jsonObj.getNumber('points')\r\n if (val != null) return val\r\n\r\n return 0\r\n }\r\n }\r\n \r\n // Fallback check profile if needed\r\n const profile = await this.getUserProfile()\r\n if (profile != null) {\r\n if (profile instanceof UTSJSONObject) {\r\n return profile.getNumber('points') ?? 0\r\n } else {\r\n const pObj = JSON.parse(JSON.stringify(profile)) as UTSJSONObject\r\n return pObj.getNumber('points') ?? 0\r\n }\r\n }\r\n \r\n return 0\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:4304','[Supabase] getUserPoints exception:', e)\r\n return 0\r\n }\r\n }\r\n\r\n // 获取钱包交易记录\r\n async getTransactions(page: number = 1, limit: number = 20): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n const from = (page - 1) * limit\r\n const to = from + limit - 1\r\n\r\n const response = await supa\r\n .from('ml_wallet_transactions')\r\n .select('*')\r\n .eq('user_id', userId!)\r\n .order('created_at', { ascending: false })\r\n .range(from, to)\r\n .execute()\r\n\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:4330','获取交易记录失败:', response.error)\r\n const empty: any[] = []\r\n return empty\r\n }\r\n \r\n const data = response.data\r\n if (data == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n return data as any[]\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:4343','获取交易记录异常:', e)\r\n const empty: any[] = []\r\n return empty\r\n }\r\n }\r\n \r\n // 获取积分记录\r\n async getPointRecords(): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n \r\n const res = await supa\r\n .from('ml_point_records')\r\n .select('*')\r\n .eq('user_id', userId!)\r\n .order('created_at', { ascending: false })\r\n .execute()\r\n \r\n if (res.error != null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n const data = res.data\r\n if (data == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n return data as any[]\r\n } catch (e) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n }\r\n\r\n // 获取用户红包\r\n async getUserRedPackets(): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n const res = await supa\r\n .from('ml_user_red_packets')\r\n .select('*')\r\n .eq('user_id', userId!)\r\n .order('created_at', { ascending: false })\r\n .execute()\r\n\r\n if (res.error != null) {\r\n __f__('error','at utils/supabaseService.uts:4398','获取红包失败:', res.error)\r\n const empty: any[] = []\r\n return empty\r\n }\r\n const data = res.data\r\n if (data == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n return data as any[]\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:4409','获取红包异常:', e)\r\n const empty: any[] = []\r\n return empty\r\n }\r\n }\r\n\r\n // 获取用户银行卡\r\n async getUserBankCards(): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n const res = await supa\r\n .from('ml_user_bank_cards')\r\n .select('*')\r\n .eq('user_id', userId!)\r\n .order('created_at', { ascending: false })\r\n .execute()\r\n\r\n if (res.error != null) {\r\n __f__('error','at utils/supabaseService.uts:4432','获取银行卡失败:', res.error)\r\n const empty: any[] = []\r\n return empty\r\n }\r\n const data = res.data\r\n if (data == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n return data as any[]\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:4443','获取银行卡异常:', e)\r\n const empty: any[] = []\r\n return empty\r\n }\r\n }\r\n\r\n // 余额充值 (调用 RPC)\r\n async rechargeBalance(amount: number): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return false\r\n \r\n const res = await supa.rpc('recharge_wallet', { \r\n p_user_id: userId,\r\n p_amount: amount \r\n })\r\n \r\n if (res.error != null) {\r\n __f__('error','at utils/supabaseService.uts:4461','充值失败RPC:', res.error)\r\n return false\r\n }\r\n \r\n // 简单判断: 如果没有error且data里success为true\r\n const data = res.data\r\n if (data instanceof UTSJSONObject) {\r\n return data.getBoolean('success') ?? false\r\n }\r\n // 如果返回不是对象,作为失败处理\r\n return false\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:4473','充值异常:', e)\r\n return false\r\n }\r\n }\r\n\r\n // 余额提现 (调用 RPC)\r\n async withdrawBalance(amount: number): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return false\r\n \r\n const res = await supa.rpc('withdraw_wallet', { \r\n p_user_id: userId,\r\n p_amount: amount \r\n })\r\n \r\n if (res.error != null) {\r\n __f__('error','at utils/supabaseService.uts:4490','提现失败RPC:', res.error)\r\n return false\r\n }\r\n \r\n const data = res.data\r\n if (data instanceof UTSJSONObject) {\r\n return data.getBoolean('success') ?? false\r\n }\r\n return false\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:4500','提现异常:', e)\r\n return false\r\n }\r\n }\r\n\r\n // 添加银行卡\r\n async addBankCard(card: UTSJSONObject): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return false\r\n \r\n // 补全 user_id\r\n card.set('user_id', userId)\r\n \r\n const res = await supa\r\n .from('ml_user_bank_cards')\r\n .insert(card)\r\n .execute()\r\n \r\n if (res.error != null) {\r\n __f__('error','at utils/supabaseService.uts:4520','添加银行卡失败:', res.error)\r\n return false\r\n }\r\n return true\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:4525','添加银行卡异常:', e)\r\n return false\r\n }\r\n }\r\n \r\n // 删除银行卡\r\n async deleteBankCard(cardId: string): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return false\r\n \r\n const res = await supa\r\n .from('ml_user_bank_cards')\r\n .eq('id', cardId)\r\n .eq('user_id', userId!)\r\n .delete()\r\n .execute()\r\n \r\n if (res.error != null) {\r\n __f__('error','at utils/supabaseService.uts:4544','删除银行卡失败:', res.error)\r\n return false\r\n }\r\n return true\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:4549','删除银行卡异常:', e)\r\n return false\r\n }\r\n }\r\n\r\n // 收藏相关\r\n async checkFavorite(productId: string): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n __f__('log','at utils/supabaseService.uts:4558',`[CheckFav] Checking for User: ${userId}, Product: ${productId}`)\r\n \r\n if (userId == null) return false\r\n \r\n const response = await supa\r\n .from('ml_user_favorites')\r\n .select('*') // Select all to verify data\r\n .eq('user_id', userId!)\r\n .eq('target_id', productId)\r\n .eq('target_type', '1') // 使用字符串 '1'\r\n .limit(1)\r\n .execute()\r\n \r\n // __f__('log','at utils/supabaseService.uts:4571',`[CheckFav] Response: ${JSON.stringify(response)}`)\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:4574',`[CheckFav] Error: ${JSON.stringify(response.error)}`)\r\n return false\r\n }\r\n \r\n const data = response.data\r\n if (Array.isArray(data)) {\r\n if ((data as any[]).length > 0) {\r\n // Double check: ensure the returned item actually matches the product ID\r\n // This guards against potential query filter failures\r\n const item = data[0]\r\n let targetId = ''\r\n if (item instanceof UTSJSONObject) {\r\n targetId = item.getString('target_id') ?? ''\r\n } else {\r\n const itemObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n targetId = itemObj.getString('target_id') ?? ''\r\n }\r\n \r\n if (targetId != '' && targetId != productId) {\r\n __f__('error','at utils/supabaseService.uts:4593',`[CheckFav] ID Mismatch! Query ${productId}, Got ${targetId}`)\r\n return false\r\n }\r\n \r\n return true\r\n }\r\n } else if (data instanceof UTSJSONObject) {\r\n // Handle single object return case (though limit(1) usually returns array)\r\n let targetId = data.getString('target_id') ?? ''\r\n if (targetId !== '' && targetId !== productId) {\r\n return false\r\n }\r\n return true\r\n }\r\n \r\n return false\r\n } catch(e) {\r\n __f__('error','at utils/supabaseService.uts:4610',`[CheckFav] Exception: ${e}`)\r\n return false\r\n }\r\n }\r\n \r\n async toggleFavorite(productId: string): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return false\r\n \r\n __f__('log','at utils/supabaseService.uts:4620',`[ToggleFav] Toggling for ${productId}`)\r\n \r\n // Check if exists\r\n const exists = await this.checkFavorite(productId)\r\n __f__('log','at utils/supabaseService.uts:4624',`[ToggleFav] Current status: ${exists}`)\r\n \r\n if (exists) {\r\n const response = await supa\r\n .from('ml_user_favorites')\r\n .eq('user_id', userId!)\r\n .eq('target_id', productId)\r\n .eq('target_type', '1')\r\n .delete()\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:4636','取消收藏失败:', response.error)\r\n return true // 仍然是收藏状态\r\n }\r\n return false // 已取消收藏\r\n } else {\r\n const response = await supa\r\n .from('ml_user_favorites')\r\n .insert({\r\n user_id: userId,\r\n target_id: productId,\r\n target_type: '1',\r\n created_at: new Date().toISOString()\r\n })\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:4652','添加收藏失败:', response.error)\r\n return false // 添加失败,仍未收藏\r\n }\r\n return true // 已收藏\r\n }\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:4658','切换收藏状态异常:', e)\r\n // 发生异常时,尝试查询当前状态返回\r\n return await this.checkFavorite(productId)\r\n }\r\n }\r\n \r\n async getFavorites(): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n \r\n // 第一步:查询收藏列表\r\n const response = await supa\r\n .from('ml_user_favorites')\r\n .select('*')\r\n .eq('user_id', userId!)\r\n .eq('target_type', '1')\r\n .order('created_at', { ascending: false })\r\n .execute()\r\n \r\n if (response.error != null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n const favorites = response.data as any[]\r\n if (favorites == null || favorites.length === 0) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n \r\n // 第二步:收集商品ID\r\n const productIds: string[] = []\r\n for (let i = 0; i < favorites.length; i++) {\r\n let item: any = favorites[i]\r\n let itemObj: UTSJSONObject\r\n if (item instanceof UTSJSONObject) {\r\n itemObj = item as UTSJSONObject\r\n } else {\r\n itemObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n }\r\n \r\n // target_id 可能是 Integer 或 String 类型,需要安全转换\r\n const targetIdRaw = itemObj.get('target_id')\r\n let pid = ''\r\n if (targetIdRaw != null) {\r\n if (typeof targetIdRaw === 'string') {\r\n pid = targetIdRaw as string\r\n } else if (typeof targetIdRaw === 'number') {\r\n pid = (targetIdRaw as number).toString()\r\n }\r\n }\r\n if (pid !== '') productIds.push(pid)\r\n }\r\n \r\n if (productIds.length === 0) return []\r\n \r\n // 第三步:批量查询商品详情\r\n const anyProductIds = productIds as any[]\r\n const productRes = await supa\r\n .from('ml_products')\r\n .select('id, name, main_image_url, base_price, sale_count')\r\n .in('id', anyProductIds)\r\n .execute()\r\n \r\n if (productRes.error != null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n const products = productRes.data as any[]\r\n const productMap = new Map()\r\n \r\n for (let i = 0; i < products.length; i++) {\r\n // 显式声明类型为 any\r\n let p: any = products[i]\r\n let pid = ''\r\n if (p instanceof UTSJSONObject) {\r\n pid = p.getString('id') ?? ''\r\n } else {\r\n const pObj = JSON.parse(JSON.stringify(p)) as UTSJSONObject\r\n pid = pObj.getString('id') ?? ''\r\n }\r\n if (pid !== '') productMap.set(pid, p)\r\n }\r\n \r\n // 第四步:组合数据\r\n const result: any[] = []\r\n for (let i = 0; i < favorites.length; i++) {\r\n let item: any = favorites[i]\r\n let newItem: UTSJSONObject\r\n \r\n if (item instanceof UTSJSONObject) {\r\n newItem = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n } else {\r\n newItem = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n }\r\n \r\n // target_id 可能是 Integer 或 String 类型,需要安全转换\r\n const targetIdRaw = newItem.get('target_id')\r\n let targetId = ''\r\n if (targetIdRaw != null) {\r\n if (typeof targetIdRaw === 'string') {\r\n targetId = targetIdRaw as string\r\n } else if (typeof targetIdRaw === 'number') {\r\n targetId = (targetIdRaw as number).toString()\r\n }\r\n }\r\n \r\n if (targetId !== '') {\r\n const product = productMap.get(targetId)\r\n if (product != null) {\r\n newItem.set('ml_products', product)\r\n result.push(newItem)\r\n }\r\n }\r\n }\r\n \r\n return result\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:4779','获取收藏列表异常:', e)\r\n return []\r\n }\r\n }\r\n\r\n // 获取足迹列表\r\n async getFootprints(): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('log','at utils/supabaseService.uts:4789','[getFootprints] 用户未登录')\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n __f__('log','at utils/supabaseService.uts:4794','[getFootprints] 查询足迹, userId:', userId)\r\n\r\n // 1. 获取足迹记录\r\n const response = await supa\r\n .from('ml_user_footprints')\r\n .select('*')\r\n .eq('user_id', userId!)\r\n .order('updated_at', { ascending: false })\r\n .limit(50)\r\n .execute()\r\n\r\n __f__('log','at utils/supabaseService.uts:4805','[getFootprints] 足迹查询 error:', response.error)\r\n __f__('log','at utils/supabaseService.uts:4806','[getFootprints] 足迹查询 data:', JSON.stringify(response.data))\r\n\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:4809','[getFootprints] 获取足迹失败:', response.error)\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n const footprints = response.data as any[]\r\n if (footprints == null || footprints.length === 0) {\r\n __f__('log','at utils/supabaseService.uts:4816','[getFootprints] 没有足迹记录')\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n __f__('log','at utils/supabaseService.uts:4821','[getFootprints] 足迹记录数量:', footprints.length)\r\n\r\n // 2. 收集商品ID\r\n const productIds: string[] = []\r\n for (let i = 0; i < footprints.length; i++) {\r\n let item = footprints[i]\r\n let pid = ''\r\n if (item instanceof UTSJSONObject) {\r\n pid = item.getString('product_id') ?? ''\r\n } else {\r\n const itemObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n pid = itemObj.getString('product_id') ?? ''\r\n }\r\n if (pid !== '' && !productIds.includes(pid)) productIds.push(pid)\r\n }\r\n\r\n if (productIds.length === 0) return []\r\n \r\n const productIdsAny: any[] = []\r\n for(let i=0; i()\r\n for(let i=0; i {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('log','at utils/supabaseService.uts:4954','[addFootprint] 用户未登录')\r\n return false\r\n }\r\n \r\n __f__('log','at utils/supabaseService.uts:4958','[addFootprint] 添加足迹, userId:', userId, 'productId:', productId)\r\n \r\n // 检查是否已存在\r\n const checkRes = await supa\r\n .from('ml_user_footprints')\r\n .select('id')\r\n .eq('user_id', userId!)\r\n .eq('product_id', productId)\r\n .execute()\r\n \r\n __f__('log','at utils/supabaseService.uts:4968','[addFootprint] 检查结果 error:', checkRes.error)\r\n __f__('log','at utils/supabaseService.uts:4969','[addFootprint] 检查结果 data:', JSON.stringify(checkRes.data))\r\n\r\n const checkData = checkRes.data as any[]\r\n const exists = checkData != null && Array.isArray(checkData) && checkData.length > 0\r\n \r\n if (checkRes.error == null && exists) {\r\n __f__('log','at utils/supabaseService.uts:4975','[addFootprint] 足迹已存在,更新时间')\r\n // 更新时间\r\n const updateRes = await supa\r\n .from('ml_user_footprints')\r\n .update({ updated_at: new Date().toISOString() })\r\n .eq('user_id', userId!)\r\n .eq('product_id', productId)\r\n .execute()\r\n __f__('log','at utils/supabaseService.uts:4983','[addFootprint] 更新结果 error:', updateRes.error)\r\n } else {\r\n __f__('log','at utils/supabaseService.uts:4985','[addFootprint] 足迹不存在,插入新记录')\r\n // 插入新记录\r\n const insertPayload = new UTSJSONObject()\r\n insertPayload.set('user_id', userId!)\r\n insertPayload.set('product_id', productId)\r\n insertPayload.set('created_at', new Date().toISOString())\r\n insertPayload.set('updated_at', new Date().toISOString())\r\n \r\n const insertRes = await supa\r\n .from('ml_user_footprints')\r\n .insert(insertPayload)\r\n .execute()\r\n __f__('log','at utils/supabaseService.uts:4997','[addFootprint] 插入结果 error:', insertRes.error)\r\n }\r\n return true\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:5001','[addFootprint] 添加足迹异常:', e)\r\n return false\r\n }\r\n }\r\n\r\n // 删除单个足迹\r\n async deleteFootprint(productId: string): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('log','at utils/supabaseService.uts:5011','[deleteFootprint] 用户未登录')\r\n return false\r\n }\r\n\r\n const response = await supa\r\n .from('ml_user_footprints')\r\n .eq('user_id', userId)\r\n .eq('product_id', productId)\r\n .delete()\r\n .execute()\r\n\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:5023','[deleteFootprint] 删除足迹失败:', response.error)\r\n return false\r\n }\r\n\r\n __f__('log','at utils/supabaseService.uts:5027','[deleteFootprint] 删除足迹成功')\r\n return true\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:5030','[deleteFootprint] 删除足迹异常:', e)\r\n return false\r\n }\r\n }\r\n\r\n // 批量删除足迹\r\n async deleteFootprints(productIds: string[]): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('log','at utils/supabaseService.uts:5040','[deleteFootprints] 用户未登录')\r\n return false\r\n }\r\n\r\n const idsAny: any[] = []\r\n for (let i = 0; i < productIds.length; i++) {\r\n idsAny.push(productIds[i])\r\n }\r\n\r\n const response = await supa\r\n .from('ml_user_footprints')\r\n .eq('user_id', userId)\r\n .in('product_id', idsAny)\r\n .delete()\r\n .execute()\r\n\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:5057','[deleteFootprints] 批量删除足迹失败:', response.error)\r\n return false\r\n }\r\n\r\n __f__('log','at utils/supabaseService.uts:5061','[deleteFootprints] 批量删除足迹成功')\r\n return true\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:5064','[deleteFootprints] 批量删除足迹异常:', e)\r\n return false\r\n }\r\n }\r\n\r\n // 清空所有足迹\r\n async clearFootprints(): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('log','at utils/supabaseService.uts:5074','[clearFootprints] 用户未登录')\r\n return false\r\n }\r\n\r\n const response = await supa\r\n .from('ml_user_footprints')\r\n .eq('user_id', userId)\r\n .delete()\r\n .execute()\r\n\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:5085','[clearFootprints] 清空足迹失败:', response.error)\r\n return false\r\n }\r\n\r\n __f__('log','at utils/supabaseService.uts:5089','[clearFootprints] 清空足迹成功')\r\n return true\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:5092','[clearFootprints] 清空足迹异常:', e)\r\n return false\r\n }\r\n }\r\n\r\n async getAddressList(): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n const empty: UserAddress[] = []\r\n return empty\r\n }\r\n\r\n const response = await supa\r\n .from('ml_user_addresses')\r\n .select('*, recipient_name:receiver_name, phone:receiver_phone, detail_address:address_detail')\r\n .eq('user_id', userId!)\r\n .order('is_default', { ascending: false })\r\n .order('created_at', { ascending: false })\r\n .execute()\r\n\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:5114','获取地址列表失败:', response.error)\r\n const empty: UserAddress[] = []\r\n return empty\r\n }\r\n return response.data as UserAddress[]\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:5120','获取地址列表异常:', e)\r\n const empty: UserAddress[] = []\r\n return empty\r\n }\r\n }\r\n\r\n // 设置默认地址\r\n async setDefaultAddress(addressId: string): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('error','at utils/supabaseService.uts:5131','用户未登录,无法设置默认地址')\r\n return false\r\n }\r\n\r\n // 先取消所有默认地址\r\n await this.clearDefaultAddress(userId!)\r\n\r\n // 设置新的默认地址\r\n const response = await supa\r\n .from('ml_user_addresses')\r\n .update({\r\n is_default: true,\r\n updated_at: new Date().toISOString()\r\n })\r\n .eq('id', addressId)\r\n .eq('user_id', userId!)\r\n .execute()\r\n\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:5150','设置默认地址失败:', response.error)\r\n return false\r\n }\r\n\r\n return true\r\n } catch (error) {\r\n __f__('error','at utils/supabaseService.uts:5156','设置默认地址异常:', error)\r\n return false\r\n }\r\n }\r\n\r\n // 获取用户优惠券列表\r\n async getUserCoupons(status: number = 1): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n const empty: UserCoupon[] = []\r\n return empty\r\n }\r\n\r\n // 假设有一个视图或者直接关联 ml_user_coupons 和 ml_coupon_templates\r\n // 这里简化处理,尝试直接从 ml_user_coupons 读取,并且加入 template 信息\r\n // 如果没有 view,可能需要改为两个查询或者使用 left join\r\n const response = await supa\r\n .from('ml_user_coupons')\r\n .select('*, template:ml_coupon_templates(name, amount, min_spend)')\r\n .eq('user_id', userId!)\r\n .eq('status', status.toString())\r\n .order('expire_at', { ascending: true })\r\n .execute()\r\n\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:5182','获取优惠券失败:', response.error)\r\n const empty: UserCoupon[] = []\r\n return empty\r\n }\r\n\r\n // 安全处理返回数据 - 安卓端可能是 UTSJSONObject 或 UTSArray\r\n const rawData: any[] = []\r\n const respData = response.data\r\n __f__('log','at utils/supabaseService.uts:5190','[getUserCoupons] 原始数据类型:', typeof respData, '是否数组:', Array.isArray(respData))\r\n if (respData != null) {\r\n if (Array.isArray(respData)) {\r\n const arr = respData as any[]\r\n __f__('log','at utils/supabaseService.uts:5194','[getUserCoupons] 数组长度:', arr.length)\r\n for (let i = 0; i < arr.length; i++) {\r\n rawData.push(arr[i])\r\n }\r\n } else if (respData instanceof UTSJSONObject) {\r\n // 单个对象情况,包装成数组\r\n __f__('log','at utils/supabaseService.uts:5200','[getUserCoupons] 单个对象,包装成数组')\r\n rawData.push(respData)\r\n } else {\r\n // 尝试 JSON 转换\r\n try {\r\n const parsed = JSON.parse(JSON.stringify(respData))\r\n __f__('log','at utils/supabaseService.uts:5206','[getUserCoupons] JSON转换后是否数组:', Array.isArray(parsed))\r\n if (Array.isArray(parsed)) {\r\n __f__('log','at utils/supabaseService.uts:5208','[getUserCoupons] 转换后数组长度:', parsed.length)\r\n for (let i = 0; i < parsed.length; i++) {\r\n rawData.push(parsed[i])\r\n }\r\n }\r\n } catch (parseErr) {\r\n __f__('error','at utils/supabaseService.uts:5214','解析优惠券数据异常:', parseErr)\r\n }\r\n }\r\n }\r\n __f__('log','at utils/supabaseService.uts:5218','[getUserCoupons] 最终rawData长度:', rawData.length)\r\n\r\n // 映射数据,将 template 的字段展平\r\n const coupons: UserCoupon[] = []\r\n for (let i = 0; i < rawData.length; i++) {\r\n const item = rawData[i]\r\n let template: any | null = null\r\n let itemId = ''\r\n let itemUserId = ''\r\n let itemTmplId = ''\r\n let itemCode = ''\r\n let itemStatus = 0\r\n let itemRecv = ''\r\n let itemExpire = ''\r\n \r\n if (item instanceof UTSJSONObject) {\r\n template = item.get('template') as any | null\r\n itemId = item.getString('id') ?? ''\r\n itemUserId = item.getString('user_id') ?? ''\r\n itemTmplId = item.getString('template_id') ?? ''\r\n itemCode = item.getString('coupon_code') ?? ''\r\n itemStatus = item.getNumber('status') ?? 0\r\n itemRecv = item.getString('received_at') ?? ''\r\n itemExpire = item.getString('expire_at') ?? ''\r\n } else {\r\n const iObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n template = iObj.get('template') as any | null\r\n itemId = iObj.getString('id') ?? ''\r\n itemUserId = iObj.getString('user_id') ?? ''\r\n itemTmplId = iObj.getString('template_id') ?? ''\r\n itemCode = iObj.getString('coupon_code') ?? ''\r\n itemStatus = iObj.getNumber('status') ?? 0\r\n itemRecv = iObj.getString('received_at') ?? ''\r\n itemExpire = iObj.getString('expire_at') ?? ''\r\n }\r\n \r\n if (template == null) template = new UTSJSONObject()\r\n \r\n let tName = ''\r\n let tAmount = 0\r\n let tMin = 0\r\n \r\n if (template instanceof UTSJSONObject) {\r\n tName = template.getString('name') ?? '优惠券'\r\n tAmount = template.getNumber('amount') ?? 0\r\n tMin = template.getNumber('min_spend') ?? 0\r\n } else {\r\n const tObj = JSON.parse(JSON.stringify(template)) as UTSJSONObject\r\n tName = tObj.getString('name') ?? '优惠券'\r\n tAmount = tObj.getNumber('amount') ?? 0\r\n tMin = tObj.getNumber('min_spend') ?? 0\r\n }\r\n\r\n // 创建真正的 UserCoupon 对象,而不是 UTSJSONObject\r\n const couponItem: UserCoupon = {\r\n id: itemId,\r\n user_id: itemUserId,\r\n template_id: itemTmplId,\r\n coupon_code: itemCode,\r\n status: itemStatus,\r\n received_at: itemRecv,\r\n expire_at: itemExpire,\r\n template_name: tName,\r\n amount: tAmount,\r\n min_spend: tMin\r\n }\r\n \r\n coupons.push(couponItem)\r\n }\r\n\r\n return coupons\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:5290','获取优惠券异常:', e)\r\n const empty: UserCoupon[] = []\r\n return empty\r\n }\r\n }\r\n\r\n // 获取可用优惠券数量\r\n async getUserCouponCount(): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return 0\r\n\r\n const response = await supa\r\n .from('ml_user_coupons')\r\n .select('id', { count: 'exact' })\r\n .eq('user_id', userId!)\r\n .eq('status', '1')\r\n .gt('expire_at', new Date().toISOString())\r\n .limit(1)\r\n .execute()\r\n\r\n if (response.error != null) {\r\n return 0\r\n }\r\n return response.total ?? 0\r\n } catch (e) {\r\n return 0\r\n }\r\n }\r\n\r\n // 获取店铺/商品可用优惠券\r\n async getAvailableCoupons(merchantId: string): Promise {\r\n return this.fetchShopCoupons(merchantId)\r\n }\r\n\r\n // ALIAS for Cache busting: 获取店铺优惠券\r\n async fetchShopCoupons(merchantId: string): Promise {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:5328','[fetchShopCoupons] 开始获取优惠券,merchantId:', merchantId)\r\n // 查询该商家的优惠券 + 平台通用券 (merchant_id is null)\r\n // 注意:这里简化逻辑,实际可能需要联合查询用户是否已领取\r\n const response = await supa\r\n .from('ml_coupon_templates')\r\n .select('*')\r\n .or(`merchant_id.eq.${merchantId},merchant_id.is.null`)\r\n .eq('status', '1') // 使用字符串 '1'\r\n .gt('end_time', new Date().toISOString())\r\n .order('discount_value', { ascending: false })\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:5341','Fetch coupons failed:', response.error)\r\n const empty: any[] = []\r\n return empty\r\n }\r\n \r\n const data = response.data\r\n if (data == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n __f__('log','at utils/supabaseService.uts:5351','[fetchShopCoupons] 获取到优惠券数量:', (data as any[]).length)\r\n return data as any[]\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:5354','Fetch coupons error:', e)\r\n const empty: any[] = []\r\n return empty\r\n }\r\n }\r\n\r\n // 领取优惠券\r\n async claimCoupon(templateId: string, userId: string): Promise {\r\n return this.claimShopCoupon(templateId, userId)\r\n }\r\n\r\n // ALIAS for Cache busting\r\n async claimShopCoupon(templateId: string, userId: string): Promise {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:5368','Claiming coupon templateId:', templateId, 'userId:', userId)\r\n\r\n // 1. Fetch template details to get merchant_id and validity\r\n const tmplRes = await supa\r\n .from('ml_coupon_templates')\r\n .select('*')\r\n .eq('id', templateId)\r\n .limit(1)\r\n .execute()\r\n \r\n if (tmplRes.error != null) {\r\n __f__('error','at utils/supabaseService.uts:5379','Claim Coupon: Template query error', tmplRes.error)\r\n return false\r\n }\r\n\r\n // Null check for data\r\n if (tmplRes.data == null) {\r\n __f__('error','at utils/supabaseService.uts:5385','Claim Coupon: Template data response is null')\r\n return false\r\n }\r\n \r\n const dataList = tmplRes.data as any[]\r\n if (dataList.length === 0) {\r\n __f__('error','at utils/supabaseService.uts:5391','Claim Coupon: Template not found (empty list)')\r\n return false\r\n }\r\n\r\n const template = dataList[0]\r\n \r\n // Safe property access\r\n let validDays = 0\r\n let endTimeStr: string | null = null\r\n let merchantId: string | null = null\r\n \r\n if (template instanceof UTSJSONObject) {\r\n validDays = template.getNumber('valid_days') ?? 0\r\n endTimeStr = template.getString('end_time')\r\n merchantId = template.getString('merchant_id')\r\n } else {\r\n const tJson = JSON.parse(JSON.stringify(template)) as UTSJSONObject\r\n validDays = tJson.getNumber('valid_days') ?? 0\r\n endTimeStr = tJson.getString('end_time')\r\n merchantId = tJson.getString('merchant_id')\r\n }\r\n \r\n // Calculate expire_at\r\n let expireAt = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString()\r\n if (validDays > 0) {\r\n expireAt = new Date(Date.now() + (validDays * 24 * 60 * 60 * 1000)).toISOString()\r\n } else if (endTimeStr != null && endTimeStr !== '') {\r\n expireAt = endTimeStr\r\n }\r\n \r\n // Handle UUID fields: Empty string is not valid UUID, must be null\r\n if (merchantId != null && merchantId.length === 0) {\r\n merchantId = null\r\n }\r\n\r\n // 2. Insert into user coupons with merchant_id\r\n const insertData = {\r\n user_id: userId,\r\n template_id: templateId,\r\n merchant_id: merchantId, // Important for shop filtering: null for platform coupons\r\n coupon_code: 'C' + Date.now() + Math.floor(Math.random() * 1000), \r\n status: 1, \r\n expire_at: expireAt,\r\n received_at: new Date().toISOString()\r\n }\r\n \r\n __f__('log','at utils/supabaseService.uts:5437','Claim Coupon Insert Payload:', JSON.stringify(insertData))\r\n\r\n const response = await supa\r\n .from('ml_user_coupons')\r\n .insert(insertData)\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:5445','Claim Coupon: Insert failed:', JSON.stringify(response.error))\r\n // 尝试降级:如果 merchant_id 报错,尝试不带 merchant_id (仅调试用,或兼容旧表结构)\r\n if (JSON.stringify(response.error).includes('merchant_id')) {\r\n __f__('log','at utils/supabaseService.uts:5448','Retrying without merchant_id...')\r\n const fallbackData = {\r\n user_id: userId,\r\n template_id: templateId,\r\n coupon_code: 'C' + Date.now() + Math.random().toString().substring(2,6),\r\n status: 1,\r\n expire_at: expireAt,\r\n received_at: new Date().toISOString()\r\n }\r\n const res2 = await supa.from('ml_user_coupons').insert(fallbackData).execute()\r\n if (res2.error == null) return true\r\n }\r\n return false\r\n }\r\n return true\r\n } catch(e) {\r\n __f__('error','at utils/supabaseService.uts:5464','Claim coupon error:', e)\r\n return false\r\n }\r\n }\r\n\r\n // ==========================================\r\n // 聊天相关方法\r\n // ==========================================\r\n\r\n // 发送消息\r\n async sendMessage(merchantId: string, content: string, msgType: string = 'text'): Promise {\r\n // 确保 session 有效\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('error','at utils/supabaseService.uts:5478',\"sendMessage failed: user not logged in or session lost\")\r\n return false\r\n }\r\n\r\n try {\r\n // Debug check\r\n // const session = supa.getSession()\r\n // __f__('log','at utils/supabaseService.uts:5485',\"Sending check: UserID\", userId, \"AuthID:\", session.user?.getString('id'))\r\n \r\n const msg = {\r\n sender_id: userId!,\r\n receiver_id: merchantId,\r\n content: content,\r\n msg_type: msgType,\r\n is_read: false,\r\n is_from_user: true\r\n }\r\n \r\n const response = await supa\r\n .from('ml_chat_messages')\r\n .insert(msg)\r\n .execute()\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:5502','sendMessage error:', response.error)\r\n return false\r\n }\r\n return true\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:5507','sendMessage exception:', e)\r\n return false\r\n }\r\n }\r\n \r\n // 上传聊天图片\r\n async uploadChatImage(filePath: string): Promise {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n __f__('error','at utils/supabaseService.uts:5516',\"uploadChatImage failed: user not logged in\")\r\n return ''\r\n }\r\n \r\n try {\r\n // 生成唯一文件名\r\n const timestamp = Date.now()\r\n const randomStr = Math.random().toString(36).substring(2, 8)\r\n const fileName = `chat_${userId}_${timestamp}_${randomStr}.jpg`\r\n const storagePath = `chat-images/${fileName}`\r\n \r\n __f__('log','at utils/supabaseService.uts:5527','[uploadChatImage] 开始上传:', filePath, '->', storagePath)\r\n \r\n const response = await supa.storage\r\n .from('chat')\r\n .upload(storagePath, filePath, {})\r\n \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:5534','[uploadChatImage] 上传失败:', response.error)\r\n return ''\r\n }\r\n \r\n // 构建公开访问URL\r\n const publicUrl = `${supa.baseUrl}/storage/v1/object/public/chat/${storagePath}`\r\n __f__('log','at utils/supabaseService.uts:5540','[uploadChatImage] 上传成功:', publicUrl)\r\n return publicUrl\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:5543','[uploadChatImage] 上传异常:', e)\r\n return ''\r\n }\r\n }\r\n \r\n // 标记会话已读\r\n async markRead(merchantId: string): Promise {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return false\r\n try {\r\n const response = await supa\r\n .from('ml_chat_messages')\r\n .update({ is_read: true })\r\n .eq('sender_id', merchantId)\r\n .eq('receiver_id', userId)\r\n .eq('is_read', false)\r\n .execute() \r\n\r\n if (response.error != null) return false\r\n } catch (e) { return false }\r\n return true\r\n }\r\n\r\n // 提交商品评价\r\n async submitProductReviews(reviews: Array): Promise {\r\n try {\r\n for (let i: number = 0; i < reviews.length; i++) {\r\n const review = reviews[i]\r\n const response = await supa\r\n .from('ml_product_reviews')\r\n .insert(review)\r\n .execute() \r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:5576','提交商品评价失败:', response.error)\r\n return false\r\n }\r\n }\r\n return true\r\n } catch (e) { \r\n __f__('error','at utils/supabaseService.uts:5582','提交商品评价失败:', e)\r\n return false \r\n }\r\n }\r\n\r\n // 提交店铺评价\r\n async submitShopReview(review: UTSJSONObject): Promise {\r\n try {\r\n const response = await supa\r\n .from('ml_shop_reviews')\r\n .insert(review)\r\n .execute() \r\n return response.error == null\r\n } catch (e) { \r\n __f__('error','at utils/supabaseService.uts:5596','提交店铺评价失败:', e)\r\n return false \r\n }\r\n }\r\n\r\n // 更新订单状态\r\n async updateOrderStatus(orderId: string, status: number): Promise {\r\n try {\r\n const updateData = new UTSJSONObject()\r\n updateData.set('order_status', status)\r\n const response = await supa\r\n .from('ml_orders')\r\n .update(updateData) \r\n .eq('id', orderId)\r\n .execute() \r\n return response.error == null\r\n } catch (e) { \r\n __f__('error','at utils/supabaseService.uts:5613','更新订单状态失败:', e)\r\n return false \r\n }\r\n }\r\n\r\n // ==================== 智能推荐相关API ====================\r\n\r\n // 获取热搜词(全站搜索频率最高的关键词)\r\n async getHotKeywords(limit: number = 10): Promise {\r\n try {\r\n const response = await supa\r\n .from('ml_search_history')\r\n .select('keyword')\r\n .order('created_at', { ascending: false })\r\n .limit(100)\r\n .execute()\r\n \r\n if (response.error != null || response.data == null) {\r\n return [] as string[]\r\n }\r\n \r\n // 统计关键词频率\r\n const keywordCount = new Map()\r\n const rawList = response.data as any[]\r\n for (let i = 0; i < rawList.length; i++) {\r\n const item = rawList[i]\r\n const itemObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n const keyword = safeGetString(itemObj, 'keyword').toLowerCase().trim()\r\n if (keyword.length > 0) {\r\n const count = keywordCount.get(keyword) ?? 0\r\n keywordCount.set(keyword, count + 1)\r\n }\r\n }\r\n \r\n // 按频率排序并返回前N个 - UTS兼容方式\r\n // 将Map转换为数组进行排序\r\n type KeywordEntry = {\r\n keyword: string\r\n count: number\r\n }\r\n const entryArray: KeywordEntry[] = []\r\n \r\n // 使用forEach遍历Map(UTS支持)\r\n keywordCount.forEach((value: number, key: string) => {\r\n entryArray.push({\r\n keyword: key,\r\n count: value\r\n })\r\n })\r\n \r\n // 按count降序排序\r\n entryArray.sort((a: KeywordEntry, b: KeywordEntry): number => {\r\n return b.count - a.count\r\n })\r\n \r\n // 取前limit个并提取关键词\r\n const sortedKeywords: string[] = []\r\n const maxCount = Math.min(entryArray.length, limit)\r\n for (let i = 0; i < maxCount; i++) {\r\n sortedKeywords.push(entryArray[i].keyword)\r\n }\r\n \r\n return sortedKeywords\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:5677','获取热搜词失败:', e)\r\n return [] as string[]\r\n }\r\n }\r\n\r\n // 获取用户搜索历史\r\n async getUserSearchHistory(limit: number = 10): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n return [] as string[]\r\n }\r\n \r\n const response = await supa\r\n .from('ml_search_history')\r\n .select('keyword')\r\n .order('created_at', { ascending: false })\r\n .limit(limit * 2)\r\n .execute()\r\n \r\n if (response.error != null || response.data == null) {\r\n return [] as string[]\r\n }\r\n \r\n const keywords: string[] = []\r\n const rawList = response.data as any[]\r\n const seen = new Set()\r\n \r\n for (let i = 0; i < rawList.length; i++) {\r\n const item = rawList[i]\r\n const itemObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n const rawUserId = itemObj.get('user_id')\r\n const itemUserId = (typeof rawUserId == 'string') ? (rawUserId as string) : ''\r\n \r\n // 只获取当前用户的搜索历史\r\n if (itemUserId !== userId) continue\r\n \r\n const keyword = safeGetString(itemObj, 'keyword').trim()\r\n if (keyword.length > 0 && !seen.has(keyword)) {\r\n keywords.push(keyword)\r\n seen.add(keyword)\r\n if (keywords.length >= limit) break\r\n }\r\n }\r\n \r\n return keywords\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:5724','获取用户搜索历史失败:', e)\r\n return [] as string[]\r\n }\r\n }\r\n\r\n // 获取用户浏览历史中的商品分类\r\n async getUserBrowseCategories(limit: number = 5): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n return [] as string[]\r\n }\r\n \r\n const response = await supa\r\n .from('ml_browse_history')\r\n .select('product_id')\r\n .order('created_at', { ascending: false })\r\n .limit(20)\r\n .execute()\r\n \r\n if (response.error != null || response.data == null) {\r\n return [] as string[]\r\n }\r\n \r\n // 获取浏览过的商品ID\r\n const productIds: string[] = []\r\n const rawList = response.data as any[]\r\n for (let i = 0; i < rawList.length; i++) {\r\n const item = rawList[i]\r\n const itemObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n \r\n // 手动过滤 user_id\r\n const rawUserId = itemObj.get('user_id')\r\n const itemUserId = (typeof rawUserId == 'string') ? (rawUserId as string) : ''\r\n if (itemUserId !== userId) continue\r\n \r\n const productId = safeGetString(itemObj, 'product_id')\r\n if (productId.length > 0) {\r\n productIds.push(productId)\r\n }\r\n }\r\n \r\n if (productIds.length === 0) {\r\n return [] as string[]\r\n }\r\n \r\n // 查询这些商品的分类\r\n const prodResponse = await supa\r\n .from('ml_products')\r\n .select('category_id')\r\n .limit(50)\r\n .execute()\r\n \r\n if (prodResponse.error != null || prodResponse.data == null) {\r\n return [] as string[]\r\n }\r\n \r\n const categoryIds: string[] = []\r\n const prodList = prodResponse.data as any[]\r\n for (let i = 0; i < prodList.length; i++) {\r\n const prodItem = prodList[i]\r\n const prodObj = JSON.parse(JSON.stringify(prodItem)) as UTSJSONObject\r\n const prodId = safeGetString(prodObj, 'id')\r\n \r\n // 只统计浏览过的商品\r\n let found = false\r\n for (let j = 0; j < productIds.length; j++) {\r\n if (productIds[j] == prodId) {\r\n found = true\r\n break\r\n }\r\n }\r\n if (!found) continue\r\n \r\n const catId = safeGetString(prodObj, 'category_id')\r\n if (catId.length > 0 && categoryIds.indexOf(catId) < 0) {\r\n categoryIds.push(catId)\r\n if (categoryIds.length >= limit) break\r\n }\r\n }\r\n \r\n return categoryIds\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:5807','获取用户浏览分类失败:', e)\r\n return [] as string[]\r\n }\r\n }\r\n\r\n // 智能推荐:综合用户搜索历史、浏览历史、热销商品\r\n async getSmartRecommendations(limit: number = 10): Promise {\r\n try {\r\n __f__('log','at utils/supabaseService.uts:5815','[getSmartRecommendations] 开始获取智能推荐...')\r\n \r\n const products: Product[] = []\r\n const addedIds = new Set()\r\n \r\n // 1. 根据用户搜索历史推荐商品(权重最高)\r\n const searchHistory = await this.getUserSearchHistory(5)\r\n __f__('log','at utils/supabaseService.uts:5822','[getSmartRecommendations] 用户搜索历史:', searchHistory)\r\n \r\n if (searchHistory.length > 0) {\r\n // 根据搜索关键词查找商品\r\n const keywordProducts = await this.searchProductsByKeywords(searchHistory, limit)\r\n for (let i = 0; i < keywordProducts.length; i++) {\r\n const prod = keywordProducts[i]\r\n if (!addedIds.has(prod.id)) {\r\n products.push(prod)\r\n addedIds.add(prod.id)\r\n }\r\n }\r\n }\r\n \r\n // 2. 根据用户浏览历史推荐相似分类商品\r\n if (products.length < limit) {\r\n const browseCategories = await this.getUserBrowseCategories(3)\r\n __f__('log','at utils/supabaseService.uts:5839','[getSmartRecommendations] 用户浏览分类:', browseCategories)\r\n \r\n if (browseCategories.length > 0) {\r\n const categoryProducts = await this.getProductsByCategories(browseCategories, limit - products.length)\r\n for (let i = 0; i < categoryProducts.length; i++) {\r\n const prod = categoryProducts[i]\r\n if (!addedIds.has(prod.id)) {\r\n products.push(prod)\r\n addedIds.add(prod.id)\r\n }\r\n }\r\n }\r\n }\r\n \r\n // 3. 补充热销商品\r\n if (products.length < limit) {\r\n const hotProducts = await this.getHotProducts(limit - products.length + 5)\r\n for (let i = 0; i < hotProducts.length; i++) {\r\n const prod = hotProducts[i]\r\n if (!addedIds.has(prod.id)) {\r\n products.push(prod)\r\n addedIds.add(prod.id)\r\n if (products.length >= limit) break\r\n }\r\n }\r\n }\r\n \r\n // 4. 如果还不够,用普通商品补充\r\n if (products.length < limit) {\r\n const moreProducts = await this.getProductsByPrice(limit - products.length + 5, false)\r\n for (let i = 0; i < moreProducts.length; i++) {\r\n const prod = moreProducts[i]\r\n if (!addedIds.has(prod.id)) {\r\n products.push(prod)\r\n addedIds.add(prod.id)\r\n if (products.length >= limit) break\r\n }\r\n }\r\n }\r\n \r\n __f__('log','at utils/supabaseService.uts:5879','[getSmartRecommendations] 返回商品数量:', products.length)\r\n return products.slice(0, limit)\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:5882','获取智能推荐失败:', e)\r\n return [] as Product[]\r\n }\r\n }\r\n\r\n // 根据关键词列表搜索商品\r\n async searchProductsByKeywords(keywords: string[], limit: number): Promise {\r\n try {\r\n const response = await supa\r\n .from('ml_products_detail_view')\r\n .select('id, name, description, base_price, market_price, main_image_url, image_urls, category_id, brand_id, merchant_id, total_stock, sale_count, status, is_featured, is_new, is_hot')\r\n .order('sale_count', { ascending: false })\r\n .limit(limit * 2)\r\n .execute()\r\n \r\n if (response.error != null || response.data == null) {\r\n return [] as Product[]\r\n }\r\n \r\n const products: Product[] = []\r\n const rawList = response.data as any[]\r\n \r\n for (let i = 0; i < rawList.length; i++) {\r\n const item = rawList[i]\r\n const prodObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n \r\n // 手动过滤 status\r\n const rawStatus = prodObj.get('status')\r\n let statusNum: number = 0\r\n if (typeof rawStatus == 'number') {\r\n statusNum = rawStatus as number\r\n }\r\n if (statusNum !== 1) continue\r\n \r\n // 检查是否匹配任何关键词\r\n const name = safeGetString(prodObj, 'name').toLowerCase()\r\n const desc = safeGetString(prodObj, 'description').toLowerCase()\r\n \r\n let matched = false\r\n for (let j = 0; j < keywords.length; j++) {\r\n const keyword = keywords[j].toLowerCase()\r\n if (name.indexOf(keyword) >= 0 || desc.indexOf(keyword) >= 0) {\r\n matched = true\r\n break\r\n }\r\n }\r\n \r\n if (!matched) continue\r\n \r\n products.push(parseProductFromRaw(item))\r\n if (products.length >= limit) break\r\n }\r\n \r\n return products\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:5937','根据关键词搜索商品失败:', e)\r\n return [] as Product[]\r\n }\r\n }\r\n\r\n // 根据分类列表获取商品\r\n async getProductsByCategories(categoryIds: string[], limit: number): Promise {\r\n try {\r\n const response = await supa\r\n .from('ml_products_detail_view')\r\n .select('id, name, description, base_price, market_price, main_image_url, image_urls, category_id, brand_id, merchant_id, total_stock, sale_count, status, is_featured, is_new, is_hot')\r\n .order('sale_count', { ascending: false })\r\n .limit(limit * 2)\r\n .execute()\r\n \r\n if (response.error != null || response.data == null) {\r\n return [] as Product[]\r\n }\r\n \r\n const products: Product[] = []\r\n const rawList = response.data as any[]\r\n \r\n for (let i = 0; i < rawList.length; i++) {\r\n const item = rawList[i]\r\n const prodObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject\r\n \r\n // 手动过滤 status\r\n const rawStatus = prodObj.get('status')\r\n let statusNum: number = 0\r\n if (typeof rawStatus == 'number') {\r\n statusNum = rawStatus as number\r\n }\r\n if (statusNum !== 1) continue\r\n \r\n // 手动过滤 category_id\r\n const rawCatId = prodObj.get('category_id')\r\n const itemCatId = (typeof rawCatId == 'string') ? (rawCatId as string) : ''\r\n \r\n let matched = false\r\n for (let j = 0; j < categoryIds.length; j++) {\r\n if (itemCatId == categoryIds[j]) {\r\n matched = true\r\n break\r\n }\r\n }\r\n \r\n if (!matched) continue\r\n \r\n products.push(parseProductFromRaw(item))\r\n if (products.length >= limit) break\r\n }\r\n \r\n return products\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:5991','根据分类获取商品失败:', e)\r\n return [] as Product[]\r\n }\r\n }\r\n\r\n // 记录用户搜索行为\r\n async recordSearch(keyword: string, resultCount: number): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n const searchRecord = new UTSJSONObject()\r\n searchRecord.set('keyword', keyword)\r\n searchRecord.set('result_count', resultCount)\r\n if (userId != null) {\r\n searchRecord.set('user_id', userId)\r\n }\r\n \r\n await supa\r\n .from('ml_search_history')\r\n .insert(searchRecord)\r\n .execute()\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:6012','记录搜索失败:', e)\r\n }\r\n }\r\n\r\n // 记录用户浏览行为\r\n async recordBrowse(productId: string, duration: number = 0): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return\r\n \r\n const browseRecord = new UTSJSONObject()\r\n browseRecord.set('user_id', userId)\r\n browseRecord.set('product_id', productId)\r\n browseRecord.set('browse_duration', duration)\r\n browseRecord.set('created_at', new Date().toISOString())\r\n \r\n // UTS Android不支持upsert,使用insert\r\n await supa\r\n .from('ml_browse_history')\r\n .insert(browseRecord)\r\n .execute()\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:6034','记录浏览失败:', e)\r\n }\r\n }\r\n\r\n // ==================== 签到相关API ====================\r\n\r\n // 用户签到\r\n async signin(): Promise {\r\n const result = new UTSJSONObject()\r\n result.set('success', false)\r\n result.set('points', 0)\r\n result.set('continuous_days', 0)\r\n result.set('bonus_points', 0)\r\n result.set('total_points', 0)\r\n result.set('message', '')\r\n\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n result.set('message', '请先登录')\r\n return result\r\n }\r\n\r\n const today = new Date()\r\n const todayStr = today.toISOString().split('T')[0]\r\n const yesterday = new Date(today.getTime() - 24 * 60 * 60 * 1000)\r\n const yesterdayStr = yesterday.toISOString().split('T')[0]\r\n\r\n // 检查今天是否已签到\r\n const checkRes = await supa\r\n .from('ml_signin_records')\r\n .select('*')\r\n .eq('user_id', userId!)\r\n .eq('signin_date', todayStr)\r\n .execute()\r\n\r\n if (checkRes.error != null) {\r\n result.set('message', '查询签到状态失败')\r\n return result\r\n }\r\n\r\n const checkData = checkRes.data as any[]\r\n if (checkData != null && checkData.length > 0) {\r\n result.set('message', '今天已签到')\r\n return result\r\n }\r\n\r\n // 查询昨天是否签到,计算连续天数\r\n const yesterdayRes = await supa\r\n .from('ml_signin_records')\r\n .select('continuous_days')\r\n .eq('user_id', userId!)\r\n .eq('signin_date', yesterdayStr)\r\n .execute()\r\n\r\n let continuousDays = 1\r\n if (yesterdayRes.error == null && yesterdayRes.data != null) {\r\n const yData = yesterdayRes.data as any[]\r\n if (yData.length > 0) {\r\n const yItem = yData[0]\r\n let yDays = 0\r\n if (yItem instanceof UTSJSONObject) {\r\n yDays = yItem.getNumber('continuous_days') ?? 0\r\n } else {\r\n const yObj = JSON.parse(JSON.stringify(yItem)) as UTSJSONObject\r\n yDays = yObj.getNumber('continuous_days') ?? 0\r\n }\r\n continuousDays = yDays + 1\r\n }\r\n }\r\n\r\n // 计算积分\r\n let pointsEarned = 5 // 每日签到基础积分\r\n let bonusPoints = 0\r\n\r\n if (continuousDays >= 30) {\r\n bonusPoints = 100\r\n } else if (continuousDays >= 7) {\r\n bonusPoints = 20\r\n }\r\n\r\n const totalPointsEarned = pointsEarned + bonusPoints\r\n\r\n // 插入签到记录\r\n const signinRecord = new UTSJSONObject()\r\n signinRecord.set('user_id', userId!)\r\n signinRecord.set('signin_date', todayStr)\r\n signinRecord.set('points_earned', pointsEarned)\r\n signinRecord.set('bonus_points', bonusPoints)\r\n signinRecord.set('continuous_days', continuousDays)\r\n\r\n const insertRes = await supa\r\n .from('ml_signin_records')\r\n .insert(signinRecord)\r\n .execute()\r\n\r\n if (insertRes.error != null) {\r\n result.set('message', '签到失败')\r\n return result\r\n }\r\n\r\n // 更新用户积分\r\n await this.addPoints(userId!, totalPointsEarned, 'signin', '每日签到')\r\n\r\n // 获取最新积分\r\n const newPoints = await this.getUserPoints()\r\n\r\n result.set('success', true)\r\n result.set('points', pointsEarned)\r\n result.set('continuous_days', continuousDays)\r\n result.set('bonus_points', bonusPoints)\r\n result.set('total_points', newPoints)\r\n result.set('message', '签到成功')\r\n\r\n return result\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:6150','签到异常:', e)\r\n result.set('message', '签到异常')\r\n return result\r\n }\r\n }\r\n\r\n // 获取签到记录(当月)\r\n async getSigninRecords(year: number, month: number): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n const startDate = `${year}-${month.toString().padStart(2, '0')}-01`\r\n const endDate = month === 12 \r\n ? `${year + 1}-01-01` \r\n : `${year}-${(month + 1).toString().padStart(2, '0')}-01`\r\n\r\n const response = await supa\r\n .from('ml_signin_records')\r\n .select('*')\r\n .eq('user_id', userId!)\r\n .gte('signin_date', startDate)\r\n .lt('signin_date', endDate)\r\n .order('signin_date', { ascending: true })\r\n .execute()\r\n\r\n if (response.error != null || response.data == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n return response.data as any[]\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:6186','获取签到记录失败:', e)\r\n const empty: any[] = []\r\n return empty\r\n }\r\n }\r\n\r\n // 获取今日签到状态\r\n async getTodaySigninStatus(): Promise {\r\n const result = new UTSJSONObject()\r\n result.set('signed', false)\r\n result.set('continuous_days', 0)\r\n\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return result\r\n\r\n const today = new Date().toISOString().split('T')[0]\r\n\r\n // 检查今天是否签到\r\n const todayRes = await supa\r\n .from('ml_signin_records')\r\n .select('*')\r\n .eq('user_id', userId!)\r\n .eq('signin_date', today)\r\n .execute()\r\n\r\n if (todayRes.error == null && todayRes.data != null) {\r\n const tData = todayRes.data as any[]\r\n if (tData.length > 0) {\r\n const tItem = tData[0]\r\n let cDays = 0\r\n if (tItem instanceof UTSJSONObject) {\r\n cDays = tItem.getNumber('continuous_days') ?? 0\r\n } else {\r\n const tObj = JSON.parse(JSON.stringify(tItem)) as UTSJSONObject\r\n cDays = tObj.getNumber('continuous_days') ?? 0\r\n }\r\n result.set('signed', true)\r\n result.set('continuous_days', cDays)\r\n return result\r\n }\r\n }\r\n\r\n // 今天未签到,获取最近的连续签到天数\r\n const lastRes = await supa\r\n .from('ml_signin_records')\r\n .select('continuous_days, signin_date')\r\n .eq('user_id', userId!)\r\n .order('signin_date', { ascending: false })\r\n .limit(1)\r\n .execute()\r\n\r\n if (lastRes.error == null && lastRes.data != null) {\r\n const lData = lastRes.data as any[]\r\n if (lData.length > 0) {\r\n const lItem = lData[0]\r\n let lastDate = ''\r\n let lastDays = 0\r\n if (lItem instanceof UTSJSONObject) {\r\n lastDate = lItem.getString('signin_date') ?? ''\r\n lastDays = lItem.getNumber('continuous_days') ?? 0\r\n } else {\r\n const lObj = JSON.parse(JSON.stringify(lItem)) as UTSJSONObject\r\n lastDate = lObj.getString('signin_date') ?? ''\r\n lastDays = lObj.getNumber('continuous_days') ?? 0\r\n }\r\n\r\n const yesterday = new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString().split('T')[0]\r\n if (lastDate === yesterday) {\r\n result.set('continuous_days', lastDays)\r\n }\r\n }\r\n }\r\n\r\n return result\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:6262','获取签到状态失败:', e)\r\n return result\r\n }\r\n }\r\n\r\n // ==================== 积分兑换相关API ====================\r\n\r\n // 获取积分兑换商品列表\r\n async getPointProducts(): Promise {\r\n try {\r\n const response = await supa\r\n .from('ml_point_products')\r\n .select('*')\r\n .eq('status', 1)\r\n .gt('stock', 0)\r\n .order('sort_order', { ascending: true })\r\n .execute()\r\n\r\n if (response.error != null || response.data == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n return response.data as any[]\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:6287','获取积分商品失败:', e)\r\n const empty: any[] = []\r\n return empty\r\n }\r\n }\r\n\r\n // 积分兑换\r\n async exchangeProduct(productId: string, quantity: number, addressSnapshot: UTSJSONObject | null): Promise {\r\n const result = new UTSJSONObject()\r\n result.set('success', false)\r\n result.set('message', '')\r\n\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n result.set('message', '请先登录')\r\n return result\r\n }\r\n\r\n // 获取商品信息\r\n const productRes = await supa\r\n .from('ml_point_products')\r\n .select('*')\r\n .eq('id', productId)\r\n .single()\r\n .execute()\r\n\r\n if (productRes.error != null || productRes.data == null) {\r\n result.set('message', '商品不存在')\r\n return result\r\n }\r\n\r\n const productRaw = productRes.data\r\n let pointsRequired = 0\r\n let stock = 0\r\n let productType = ''\r\n \r\n // 检查是否是数组,如果是则取第一个元素\r\n let productObj: UTSJSONObject | null = null\r\n if (Array.isArray(productRaw)) {\r\n const arr = productRaw as any[]\r\n if (arr.length > 0) {\r\n const firstItem = arr[0]\r\n if (firstItem instanceof UTSJSONObject) {\r\n productObj = firstItem\r\n } else {\r\n productObj = JSON.parse(JSON.stringify(firstItem)) as UTSJSONObject\r\n }\r\n }\r\n } else {\r\n if (productRaw instanceof UTSJSONObject) {\r\n productObj = productRaw\r\n } else {\r\n productObj = JSON.parse(JSON.stringify(productRaw)) as UTSJSONObject\r\n }\r\n }\r\n \r\n // 使用 UTSJSONObject 方法访问属性\r\n if (productObj != null) {\r\n pointsRequired = productObj.getNumber('points_required') ?? 0\r\n stock = productObj.getNumber('stock') ?? 0\r\n productType = productObj.getString('product_type') ?? ''\r\n }\r\n\r\n const totalPoints = pointsRequired * quantity\r\n\r\n // 检查库存\r\n if (stock < quantity) {\r\n result.set('message', '库存不足')\r\n return result\r\n }\r\n\r\n // 检查积分\r\n const userPoints = await this.getUserPoints()\r\n if (userPoints < totalPoints) {\r\n result.set('message', '积分不足')\r\n return result\r\n }\r\n\r\n // 创建兑换记录\r\n const exchangeRecord = new UTSJSONObject()\r\n exchangeRecord.set('user_id', userId!)\r\n exchangeRecord.set('product_id', productId)\r\n exchangeRecord.set('quantity', quantity)\r\n exchangeRecord.set('points_used', totalPoints)\r\n exchangeRecord.set('status', 0)\r\n if (addressSnapshot != null && productType === 'physical') {\r\n exchangeRecord.set('address_snapshot', JSON.stringify(addressSnapshot))\r\n }\r\n\r\n const insertRes = await supa\r\n .from('ml_point_exchanges')\r\n .insert(exchangeRecord)\r\n .execute()\r\n\r\n if (insertRes.error != null) {\r\n __f__('error','at utils/supabaseService.uts:6383','[exchangeProduct] 创建兑换记录失败:', insertRes.error)\r\n result.set('message', '兑换失败')\r\n return result\r\n }\r\n \r\n __f__('log','at utils/supabaseService.uts:6388','[exchangeProduct] 兑换记录创建成功')\r\n\r\n // 扣减库存\r\n __f__('log','at utils/supabaseService.uts:6391','[exchangeProduct] 准备扣减库存')\r\n __f__('log','at utils/supabaseService.uts:6392','[exchangeProduct] productId 类型:', typeof productId)\r\n __f__('log','at utils/supabaseService.uts:6393','[exchangeProduct] productId 值:', productId)\r\n __f__('log','at utils/supabaseService.uts:6394','[exchangeProduct] 当前库存:', stock, ', 扣减数量:', quantity)\r\n \r\n // 使用 UTSJSONObject 替代 Record\r\n const stockUpdateData = new UTSJSONObject()\r\n stockUpdateData.set('stock', stock - quantity)\r\n \r\n __f__('log','at utils/supabaseService.uts:6400','[exchangeProduct] stockUpdateData:', stockUpdateData)\r\n __f__('log','at utils/supabaseService.uts:6401','[exchangeProduct] stockUpdateData 类型:', typeof stockUpdateData)\r\n \r\n // 先查询确认商品存在\r\n const checkProduct = await supa\r\n .from('ml_point_products')\r\n .select('id, stock')\r\n .eq('id', productId)\r\n .execute()\r\n __f__('log','at utils/supabaseService.uts:6409','[exchangeProduct] 查询商品结果:', checkProduct.data, 'error:', checkProduct.error)\r\n \r\n const stockUpdateRes = await supa\r\n .from('ml_point_products')\r\n .update(stockUpdateData)\r\n .eq('id', productId)\r\n .execute()\r\n \r\n __f__('log','at utils/supabaseService.uts:6417','[exchangeProduct] 库存更新结果 error:', stockUpdateRes.error)\r\n __f__('log','at utils/supabaseService.uts:6418','[exchangeProduct] 库存更新结果 data:', stockUpdateRes.data)\r\n \r\n if (stockUpdateRes.error != null) {\r\n __f__('error','at utils/supabaseService.uts:6421','[exchangeProduct] 扣减库存失败:', stockUpdateRes.error)\r\n }\r\n\r\n // 扣减积分\r\n __f__('log','at utils/supabaseService.uts:6425','[exchangeProduct] 准备扣减积分, userId:', userId, ', 积分:', totalPoints)\r\n const deductResult = await this.deductPoints(userId!, totalPoints, 'redeem', '积分兑换商品')\r\n __f__('log','at utils/supabaseService.uts:6427','[exchangeProduct] 积分扣减结果:', deductResult)\r\n \r\n if (!deductResult) {\r\n __f__('error','at utils/supabaseService.uts:6430','[exchangeProduct] 扣减积分失败')\r\n }\r\n\r\n __f__('log','at utils/supabaseService.uts:6433','[exchangeProduct] 兑换流程完成')\r\n result.set('success', true)\r\n result.set('message', '兑换成功')\r\n return result\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:6438','积分兑换异常:', e)\r\n result.set('message', '兑换异常')\r\n return result\r\n }\r\n }\r\n\r\n // 获取兑换记录\r\n async getExchangeRecords(): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n const response = await supa\r\n .from('ml_point_exchanges')\r\n .select('*, product:ml_point_products(name, image_url, product_type)')\r\n .eq('user_id', userId!)\r\n .order('created_at', { ascending: false })\r\n .execute()\r\n\r\n if (response.error != null || response.data == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n return response.data as any[]\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:6467','获取兑换记录失败:', e)\r\n const empty: any[] = []\r\n return empty\r\n }\r\n }\r\n\r\n // ==================== 评价相关API ====================\r\n\r\n // 获取商品评价列表\r\n async getProductReviews(productId: string, page: number = 1, limit: number = 10, rating: number = 0, hasImage: boolean = false): Promise {\r\n const result = new UTSJSONObject()\r\n result.set('total', 0)\r\n result.set('page', page)\r\n result.set('limit', limit)\r\n result.set('data', [] as any[])\r\n\r\n try {\r\n const userId = this.getCurrentUserId()\r\n \r\n let query = supa\r\n .from('ml_product_reviews')\r\n .select('*, user:auth.users!ml_product_reviews_user_id_fkey(raw_user_meta_data)', { count: 'exact' })\r\n .eq('product_id', productId)\r\n\r\n if (rating > 0) {\r\n query = query.eq('rating', rating)\r\n }\r\n\r\n if (hasImage) {\r\n query = query.neq('images', '[]')\r\n }\r\n\r\n const offset = (page - 1) * limit\r\n const response = await query\r\n .order('created_at', { ascending: false })\r\n .range(offset, offset + limit - 1)\r\n .execute()\r\n\r\n if (response.error != null) {\r\n __f__('error','at utils/supabaseService.uts:6506','获取评价列表失败:', response.error)\r\n return result\r\n }\r\n\r\n const total = response.total ?? 0\r\n const reviews = response.data as any[]\r\n\r\n // 处理评价数据\r\n const processedReviews: any[] = []\r\n for (let i = 0; i < reviews.length; i++) {\r\n const review = reviews[i]\r\n const processed = JSON.parse(JSON.stringify(review)) as UTSJSONObject\r\n\r\n // 处理用户信息\r\n const userRaw = processed.get('user')\r\n let userName = '匿名用户'\r\n let userAvatar = ''\r\n\r\n if (userRaw != null) {\r\n let userData: UTSJSONObject\r\n if (userRaw instanceof UTSJSONObject) {\r\n userData = userRaw as UTSJSONObject\r\n } else {\r\n userData = JSON.parse(JSON.stringify(userRaw)) as UTSJSONObject\r\n }\r\n const metaData = userData.get('raw_user_meta_data')\r\n if (metaData != null) {\r\n let metaObj: UTSJSONObject\r\n if (metaData instanceof UTSJSONObject) {\r\n metaObj = metaData as UTSJSONObject\r\n } else {\r\n metaObj = JSON.parse(JSON.stringify(metaData)) as UTSJSONObject\r\n }\r\n userName = metaObj.getString('nickname') ?? metaObj.getString('name') ?? '匿名用户'\r\n userAvatar = metaObj.getString('avatar_url') ?? ''\r\n }\r\n }\r\n\r\n // 检查是否匿名\r\n const isAnonymous = processed.getBoolean('is_anonymous') ?? false\r\n if (isAnonymous) {\r\n userName = '匿名用户'\r\n userAvatar = ''\r\n }\r\n\r\n processed.set('user_name', userName)\r\n processed.set('user_avatar', userAvatar)\r\n\r\n // 检查当前用户是否点赞\r\n let isLiked = false\r\n if (userId != null) {\r\n const likeRes = await supa\r\n .from('ml_review_likes')\r\n .select('id')\r\n .eq('review_id', processed.getString('id') ?? '')\r\n .eq('user_id', userId!)\r\n .limit(1)\r\n .execute()\r\n if (likeRes.error == null && likeRes.data != null) {\r\n const likeData = likeRes.data as any[]\r\n isLiked = likeData.length > 0\r\n }\r\n }\r\n processed.set('is_liked', isLiked)\r\n\r\n processedReviews.push(processed)\r\n }\r\n\r\n result.set('total', total)\r\n result.set('data', processedReviews)\r\n return result\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:6578','获取评价列表异常:', e)\r\n return result\r\n }\r\n }\r\n\r\n // 获取商品评价统计\r\n async getReviewStats(productId: string): Promise {\r\n const result = new UTSJSONObject()\r\n result.set('total_count', 0)\r\n result.set('avg_rating', 0)\r\n result.set('good_rate', 0)\r\n result.set('rating_distribution', new UTSJSONObject())\r\n result.set('tags', [] as any[])\r\n\r\n try {\r\n const response = await supa\r\n .from('ml_product_reviews')\r\n .select('rating')\r\n .eq('product_id', productId)\r\n .execute()\r\n\r\n if (response.error != null || response.data == null) {\r\n return result\r\n }\r\n\r\n const reviews = response.data as any[]\r\n const totalCount = reviews.length\r\n\r\n if (totalCount === 0) return result\r\n\r\n let totalRating = 0\r\n let goodCount = 0\r\n const distribution: Map = new Map()\r\n distribution.set(1, 0)\r\n distribution.set(2, 0)\r\n distribution.set(3, 0)\r\n distribution.set(4, 0)\r\n distribution.set(5, 0)\r\n\r\n for (let i = 0; i < reviews.length; i++) {\r\n const review = reviews[i]\r\n let rating = 0\r\n if (review instanceof UTSJSONObject) {\r\n rating = review.getNumber('rating') ?? 0\r\n } else {\r\n const rObj = JSON.parse(JSON.stringify(review)) as UTSJSONObject\r\n rating = rObj.getNumber('rating') ?? 0\r\n }\r\n\r\n totalRating += rating\r\n if (rating >= 4) goodCount++\r\n\r\n const currentCount = distribution.get(rating) ?? 0\r\n distribution.set(rating, currentCount + 1)\r\n }\r\n\r\n const avgRating = Math.round((totalRating / totalCount) * 10) / 10\r\n const goodRate = Math.round((goodCount / totalCount) * 100)\r\n\r\n const distObj = new UTSJSONObject()\r\n distribution.forEach((value: number, key: number) => {\r\n distObj.set(key.toString(), value)\r\n })\r\n\r\n result.set('total_count', totalCount)\r\n result.set('avg_rating', avgRating)\r\n result.set('good_rate', goodRate)\r\n result.set('rating_distribution', distObj)\r\n\r\n return result\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:6649','获取评价统计异常:', e)\r\n return result\r\n }\r\n }\r\n\r\n // 评价点赞\r\n async toggleReviewLike(reviewId: string): Promise {\r\n const result = new UTSJSONObject()\r\n result.set('success', false)\r\n result.set('is_liked', false)\r\n result.set('like_count', 0)\r\n\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n return result\r\n }\r\n\r\n // 检查是否已点赞\r\n const checkRes = await supa\r\n .from('ml_review_likes')\r\n .select('id')\r\n .eq('review_id', reviewId)\r\n .eq('user_id', userId!)\r\n .limit(1)\r\n .execute()\r\n\r\n let isLiked = false\r\n if (checkRes.error == null && checkRes.data != null) {\r\n const checkData = checkRes.data as any[]\r\n isLiked = checkData.length > 0\r\n }\r\n\r\n if (isLiked) {\r\n // 取消点赞\r\n await supa\r\n .from('ml_review_likes')\r\n .eq('review_id', reviewId)\r\n .eq('user_id', userId!)\r\n .delete()\r\n .execute()\r\n\r\n // 更新点赞数 - 直接查询并更新\r\n const currentCountRes = await supa\r\n .from('ml_product_reviews')\r\n .select('like_count')\r\n .eq('id', reviewId)\r\n .single()\r\n .execute()\r\n \r\n if (currentCountRes.error == null && currentCountRes.data != null) {\r\n let currentCount = 0\r\n if (currentCountRes.data instanceof UTSJSONObject) {\r\n currentCount = currentCountRes.data.getNumber('like_count') ?? 0\r\n } else {\r\n const countObj = JSON.parse(JSON.stringify(currentCountRes.data)) as UTSJSONObject\r\n currentCount = countObj.getNumber('like_count') ?? 0\r\n }\r\n \r\n const updateData = new UTSJSONObject()\r\n updateData.set('like_count', Math.max(0, currentCount - 1))\r\n await supa\r\n .from('ml_product_reviews')\r\n .update(updateData)\r\n .eq('id', reviewId)\r\n .execute()\r\n }\r\n\r\n result.set('is_liked', false)\r\n } else {\r\n // 添加点赞\r\n const likeRecord = new UTSJSONObject()\r\n likeRecord.set('review_id', reviewId)\r\n likeRecord.set('user_id', userId!)\r\n\r\n await supa\r\n .from('ml_review_likes')\r\n .insert(likeRecord)\r\n .execute()\r\n\r\n // 更新点赞数 - 直接查询并更新\r\n const currentCountRes = await supa\r\n .from('ml_product_reviews')\r\n .select('like_count')\r\n .eq('id', reviewId)\r\n .single()\r\n .execute()\r\n \r\n if (currentCountRes.error == null && currentCountRes.data != null) {\r\n let currentCount = 0\r\n if (currentCountRes.data instanceof UTSJSONObject) {\r\n currentCount = currentCountRes.data.getNumber('like_count') ?? 0\r\n } else {\r\n const countObj = JSON.parse(JSON.stringify(currentCountRes.data)) as UTSJSONObject\r\n currentCount = countObj.getNumber('like_count') ?? 0\r\n }\r\n \r\n const updateData = new UTSJSONObject()\r\n updateData.set('like_count', currentCount + 1)\r\n await supa\r\n .from('ml_product_reviews')\r\n .update(updateData)\r\n .eq('id', reviewId)\r\n .execute()\r\n }\r\n\r\n result.set('is_liked', true)\r\n }\r\n\r\n // 获取最新点赞数\r\n const reviewRes = await supa\r\n .from('ml_product_reviews')\r\n .select('like_count')\r\n .eq('id', reviewId)\r\n .single()\r\n .execute()\r\n\r\n if (reviewRes.error == null && reviewRes.data != null) {\r\n let likeCount = 0\r\n if (reviewRes.data instanceof UTSJSONObject) {\r\n likeCount = reviewRes.data.getNumber('like_count') ?? 0\r\n } else {\r\n const rObj = JSON.parse(JSON.stringify(reviewRes.data)) as UTSJSONObject\r\n likeCount = rObj.getNumber('like_count') ?? 0\r\n }\r\n result.set('like_count', likeCount)\r\n }\r\n\r\n result.set('success', true)\r\n return result\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:6780','评价点赞异常:', e)\r\n return result\r\n }\r\n }\r\n\r\n // 获取我的评价列表\r\n async getMyReviews(): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n const response = await supa\r\n .from('ml_product_reviews')\r\n .select(`\r\n *,\r\n product:ml_products!ml_product_reviews_product_id_fkey(name, main_image_url)\r\n `)\r\n .eq('user_id', userId!)\r\n .order('created_at', { ascending: false })\r\n .execute()\r\n\r\n if (response.error != null || response.data == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n const reviews = response.data as any[]\r\n const result: any[] = []\r\n\r\n for (let i = 0; i < reviews.length; i++) {\r\n const review = reviews[i]\r\n const processed = JSON.parse(JSON.stringify(review)) as UTSJSONObject\r\n\r\n // 处理商品信息\r\n const productRaw = processed.get('product')\r\n let productName = ''\r\n let productImage = ''\r\n if (productRaw != null) {\r\n let productObj: UTSJSONObject\r\n if (productRaw instanceof UTSJSONObject) {\r\n productObj = productRaw as UTSJSONObject\r\n } else {\r\n productObj = JSON.parse(JSON.stringify(productRaw)) as UTSJSONObject\r\n }\r\n productName = productObj.getString('name') ?? ''\r\n productImage = productObj.getString('main_image_url') ?? ''\r\n }\r\n processed.set('product_name', productName)\r\n processed.set('product_image', productImage)\r\n\r\n // 计算是否可追加评价(7天内)\r\n const createdAt = processed.getString('created_at') ?? ''\r\n const createdTime = new Date(createdAt).getTime()\r\n const now = Date.now()\r\n const sevenDays = 7 * 24 * 60 * 60 * 1000\r\n const canAppend = (now - createdTime) < sevenDays && (processed.getString('append_content') ?? '') === ''\r\n processed.set('can_append', canAppend)\r\n\r\n // 计算是否可编辑(24小时内)\r\n const oneDay = 24 * 60 * 60 * 1000\r\n const canEdit = (now - createdTime) < oneDay\r\n processed.set('can_edit', canEdit)\r\n\r\n result.push(processed)\r\n }\r\n\r\n return result\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:6851','获取我的评价失败:', e)\r\n const empty: any[] = []\r\n return empty\r\n }\r\n }\r\n\r\n // 追加评价\r\n async appendReview(reviewId: string, content: string, images: string[]): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return false\r\n\r\n const updateData = new UTSJSONObject()\r\n updateData.set('append_content', content)\r\n updateData.set('append_images', JSON.stringify(images))\r\n updateData.set('append_at', new Date().toISOString())\r\n\r\n const response = await supa\r\n .from('ml_product_reviews')\r\n .update(updateData)\r\n .eq('id', reviewId)\r\n .eq('user_id', userId!)\r\n .execute()\r\n\r\n return response.error == null\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:6877','追加评价失败:', e)\r\n return false\r\n }\r\n }\r\n\r\n // 删除评价\r\n async deleteReview(reviewId: string): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return false\r\n\r\n const response = await supa\r\n .from('ml_product_reviews')\r\n .delete()\r\n .eq('id', reviewId)\r\n .eq('user_id', userId!)\r\n .execute()\r\n\r\n return response.error == null\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:6897','删除评价失败:', e)\r\n return false\r\n }\r\n }\r\n\r\n // ==================== 积分辅助方法 ====================\r\n\r\n // 增加积分\r\n private async addPoints(userId: string, points: number, type: string, description: string): Promise {\r\n try {\r\n // 获取当前积分\r\n const currentPoints = await this.getUserPoints()\r\n const newPoints = currentPoints + points\r\n const totalEarned = await this.getTotalEarned()\r\n\r\n // 检查用户积分记录是否存在\r\n const checkRes = await supa\r\n .from('ml_user_points')\r\n .select('user_id')\r\n .eq('user_id', userId)\r\n .limit(1)\r\n .execute()\r\n\r\n const exists = checkRes.error == null && checkRes.data != null && (checkRes.data as any[]).length > 0\r\n\r\n if (exists) {\r\n // 更新现有记录\r\n const updateData = new UTSJSONObject()\r\n updateData.set('points', newPoints)\r\n updateData.set('total_earned', totalEarned + points)\r\n updateData.set('updated_at', new Date().toISOString())\r\n\r\n await supa\r\n .from('ml_user_points')\r\n .update(updateData)\r\n .eq('user_id', userId)\r\n .execute()\r\n } else {\r\n // 插入新记录\r\n const insertData = new UTSJSONObject()\r\n insertData.set('user_id', userId)\r\n insertData.set('points', newPoints)\r\n insertData.set('total_earned', points)\r\n insertData.set('updated_at', new Date().toISOString())\r\n\r\n await supa\r\n .from('ml_user_points')\r\n .insert(insertData)\r\n .execute()\r\n }\r\n\r\n // 记录积分变动\r\n const record = new UTSJSONObject()\r\n record.set('user_id', userId)\r\n record.set('points', points)\r\n record.set('type', type)\r\n record.set('description', description)\r\n\r\n await supa\r\n .from('ml_point_records')\r\n .insert(record)\r\n .execute()\r\n\r\n return true\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:6962','增加积分失败:', e)\r\n return false\r\n }\r\n }\r\n\r\n // 扣减积分\r\n private async deductPoints(userId: string, points: number, type: string, description: string): Promise {\r\n try {\r\n const currentPoints = await this.getUserPoints()\r\n const newPoints = currentPoints - points\r\n\r\n if (newPoints < 0) return false\r\n\r\n const updateData = new UTSJSONObject()\r\n updateData.set('points', newPoints)\r\n updateData.set('updated_at', new Date().toISOString())\r\n\r\n await supa\r\n .from('ml_user_points')\r\n .update(updateData)\r\n .eq('user_id', userId)\r\n .execute()\r\n\r\n const record = new UTSJSONObject()\r\n record.set('user_id', userId)\r\n record.set('points', -points)\r\n record.set('type', type)\r\n record.set('description', description)\r\n\r\n await supa\r\n .from('ml_point_records')\r\n .insert(record)\r\n .execute()\r\n\r\n return true\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:6998','扣减积分失败:', e)\r\n return false\r\n }\r\n }\r\n\r\n // 获取历史累计积分\r\n private async getTotalEarned(): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return 0\r\n\r\n const res = await supa\r\n .from('ml_user_points')\r\n .select('total_earned')\r\n .eq('user_id', userId!)\r\n .single()\r\n .execute()\r\n\r\n if (res.error == null && res.data != null) {\r\n if (res.data instanceof UTSJSONObject) {\r\n return res.data.getNumber('total_earned') ?? 0\r\n } else {\r\n const obj = JSON.parse(JSON.stringify(res.data)) as UTSJSONObject\r\n return obj.getNumber('total_earned') ?? 0\r\n }\r\n }\r\n return 0\r\n } catch (e) {\r\n return 0\r\n }\r\n }\r\n\r\n // ==================== 积分过期相关API ====================\r\n\r\n // 获取即将过期积分\r\n async getExpiringPoints(): Promise {\r\n const result = new UTSJSONObject()\r\n result.set('expiring_points', 0)\r\n result.set('expiring_date', null)\r\n result.set('details', [] as any[])\r\n\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return result\r\n\r\n // 查询30天内即将过期的积分记录\r\n const now = new Date()\r\n const thirtyDaysLater = new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000)\r\n const nowStr = now.toISOString()\r\n const laterStr = thirtyDaysLater.toISOString()\r\n\r\n const res = await supa\r\n .from('ml_point_records')\r\n .select('points, description, expires_at, created_at')\r\n .eq('user_id', userId!)\r\n .gt('points', 0)\r\n .eq('is_expired', false)\r\n .not('expires_at', 'is', null)\r\n .gte('expires_at', nowStr)\r\n .lte('expires_at', laterStr)\r\n .order('expires_at', { ascending: true })\r\n .execute()\r\n\r\n if (res.error != null) {\r\n __f__('error','at utils/supabaseService.uts:7062','获取即将过期积分失败:', res.error)\r\n return result\r\n }\r\n\r\n if (res.data != null && Array.isArray(res.data)) {\r\n const records = res.data as any[]\r\n let totalExpiring = 0\r\n let earliestDate: string | null = null\r\n const details: any[] = []\r\n\r\n for (let i = 0; i < records.length; i++) {\r\n const record = records[i]\r\n let recordObj: UTSJSONObject\r\n if (record instanceof UTSJSONObject) {\r\n recordObj = record\r\n } else {\r\n recordObj = JSON.parse(JSON.stringify(record)) as UTSJSONObject\r\n }\r\n\r\n const points = recordObj.getNumber('points') ?? 0\r\n const expiresAt = recordObj.getString('expires_at') ?? ''\r\n\r\n totalExpiring += points\r\n\r\n if (earliestDate == null || expiresAt < earliestDate) {\r\n earliestDate = expiresAt\r\n }\r\n\r\n details.push({\r\n points: points,\r\n description: recordObj.getString('description'),\r\n expires_at: expiresAt,\r\n created_at: recordObj.getString('created_at') ?? ''\r\n })\r\n }\r\n\r\n result.set('expiring_points', totalExpiring)\r\n result.set('expiring_date', earliestDate != null ? earliestDate.split('T')[0] : null)\r\n result.set('details', details)\r\n }\r\n\r\n return result\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:7105','获取即将过期积分异常:', e)\r\n return result\r\n }\r\n }\r\n\r\n // 获取积分概览(包含即将过期积分)\r\n async getPointsOverview(): Promise {\r\n const result = new UTSJSONObject()\r\n result.set('current_points', 0)\r\n result.set('total_earned', 0)\r\n result.set('expiring_points', 0)\r\n result.set('expiring_date', null)\r\n\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return result\r\n\r\n const res = await supa\r\n .from('ml_user_points')\r\n .select('points, total_earned, expiring_points, expiring_date')\r\n .eq('user_id', userId!)\r\n .single()\r\n .execute()\r\n\r\n if (res.error == null && res.data != null) {\r\n let data: UTSJSONObject\r\n if (res.data instanceof UTSJSONObject) {\r\n data = res.data as UTSJSONObject\r\n } else {\r\n data = JSON.parse(JSON.stringify(res.data)) as UTSJSONObject\r\n }\r\n\r\n result.set('current_points', data.getNumber('points') ?? 0)\r\n result.set('total_earned', data.getNumber('total_earned') ?? 0)\r\n result.set('expiring_points', data.getNumber('expiring_points') ?? 0)\r\n result.set('expiring_date', data.getString('expiring_date'))\r\n }\r\n\r\n return result\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:7145','获取积分概览异常:', e)\r\n return result\r\n }\r\n }\r\n\r\n // 获取过期提醒通知列表\r\n async getExpiryNotifications(): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n const res = await supa\r\n .from('ml_point_expiry_notifications')\r\n .select('*')\r\n .eq('user_id', userId!)\r\n .eq('is_sent', false)\r\n .order('expiry_date', { ascending: true })\r\n .execute()\r\n\r\n if (res.error != null || res.data == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n return res.data as any[]\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:7174','获取过期提醒失败:', e)\r\n const empty: any[] = []\r\n return empty\r\n }\r\n }\r\n\r\n // 标记过期提醒为已读\r\n async markNotificationRead(notificationId: string): Promise {\r\n try {\r\n const res = await supa\r\n .from('ml_point_expiry_notifications')\r\n .update({ is_sent: true, sent_at: new Date().toISOString() })\r\n .eq('id', notificationId)\r\n .execute()\r\n\r\n return res.error == null\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:7191','标记通知失败:', e)\r\n return false\r\n }\r\n }\r\n\r\n // 手动触发积分维护任务(管理员功能)\r\n // 注意:UTS不支持rpc,此功能需要在Supabase后台手动执行或通过其他方式触发\r\n async triggerPointsMaintenance(): Promise {\r\n __f__('warn','at utils/supabaseService.uts:7199','triggerPointsMaintenance: UTS不支持rpc调用,请在Supabase后台手动执行 daily_points_maintenance()')\r\n return false\r\n }\r\n\r\n // ==================== 推销模式 - 商家配置API ====================\r\n\r\n // 获取商家推销配置\r\n async getMerchantPromotionConfig(merchantId: string): Promise {\r\n const result = new UTSJSONObject()\r\n result.set('promotion_enabled', false)\r\n result.set('share_free_enabled', false)\r\n result.set('distribution_enabled', false)\r\n result.set('required_count', 4)\r\n result.set('reward_type', 'product_price')\r\n result.set('fixed_reward_amount', 0)\r\n\r\n try {\r\n const res = await supa\r\n .from('ml_merchant_promotion_config')\r\n .select('*')\r\n .eq('merchant_id', merchantId)\r\n .limit(1)\r\n .execute()\r\n\r\n if (res.error == null && res.data != null && Array.isArray(res.data)) {\r\n const arr = res.data as any[]\r\n if (arr.length > 0) {\r\n const item = arr[0]\r\n const itemAny = item as any\r\n \r\n if (itemAny instanceof UTSJSONObject) {\r\n result.set('promotion_enabled', itemAny.getBoolean('promotion_enabled') ?? false)\r\n result.set('share_free_enabled', itemAny.getBoolean('share_free_enabled') ?? false)\r\n result.set('distribution_enabled', itemAny.getBoolean('distribution_enabled') ?? false)\r\n result.set('required_count', itemAny.getNumber('required_count') ?? 4)\r\n result.set('reward_type', itemAny.getString('reward_type') ?? 'product_price')\r\n result.set('fixed_reward_amount', itemAny.getNumber('fixed_reward_amount') ?? 0)\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:7240','获取商家推销配置失败:', e)\r\n }\r\n\r\n return result\r\n }\r\n\r\n // 检查商家是否开启分享免单\r\n async isShareFreeEnabled(merchantId: string): Promise {\r\n try {\r\n const config = await this.getMerchantPromotionConfig(merchantId)\r\n const promotionEnabled = config.get('promotion_enabled')\r\n const shareFreeEnabled = config.get('share_free_enabled')\r\n return (promotionEnabled === true || promotionEnabled === 'true') && \r\n (shareFreeEnabled === true || shareFreeEnabled === 'true')\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:7255','检查分享免单状态失败:', e)\r\n return false\r\n }\r\n }\r\n\r\n // ==================== 推销模式 - 余额相关API ====================\r\n\r\n // 获取用户余额\r\n async getUserBalance(): Promise {\r\n const result = new UTSJSONObject()\r\n result.set('balance', 0)\r\n result.set('frozen_balance', 0)\r\n result.set('total_earned', 0)\r\n result.set('total_withdrawn', 0)\r\n\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return result\r\n\r\n const res = await supa\r\n .from('ml_user_balance')\r\n .select('*')\r\n .eq('user_id', userId!)\r\n .limit(1)\r\n .execute()\r\n\r\n if (res.error == null && res.data != null && Array.isArray(res.data)) {\r\n const arr = res.data as any[]\r\n if (arr.length > 0) {\r\n const item = arr[0]\r\n const itemAny = item as any\r\n if (itemAny instanceof UTSJSONObject) {\r\n result.set('balance', itemAny.getNumber('balance') ?? 0)\r\n result.set('frozen_balance', itemAny.getNumber('frozen_balance') ?? 0)\r\n result.set('total_earned', itemAny.getNumber('total_earned') ?? 0)\r\n result.set('total_withdrawn', itemAny.getNumber('total_withdrawn') ?? 0)\r\n }\r\n }\r\n }\r\n\r\n return result\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:7297','获取用户余额失败:', e)\r\n return result\r\n }\r\n }\r\n\r\n // 获取余额变动记录\r\n async getBalanceRecords(page: number = 1, limit: number = 20): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n const offset = (page - 1) * limit\r\n const res = await supa\r\n .from('ml_balance_records')\r\n .select('*')\r\n .eq('user_id', userId!)\r\n .order('created_at', { ascending: false })\r\n .range(offset, offset + limit - 1)\r\n .execute()\r\n\r\n if (res.error != null || res.data == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n return res.data as any[]\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:7327','获取余额记录失败:', e)\r\n const empty: any[] = []\r\n return empty\r\n }\r\n }\r\n\r\n // ==================== 推销模式 - 分享免单相关API ====================\r\n\r\n // 创建分享记录\r\n async createShareRecord(productId: string, orderId: string, orderItemId: string | null, productName: string, productImage: string | null, productPrice: number): Promise {\r\n const result = new UTSJSONObject()\r\n result.set('success', false)\r\n result.set('share_code', '')\r\n result.set('message', '')\r\n\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n result.set('message', '请先登录')\r\n return result\r\n }\r\n\r\n // 生成分享码\r\n const shareCode = this.generateShareCode()\r\n\r\n const insertData = new UTSJSONObject()\r\n insertData.set('user_id', userId)\r\n insertData.set('product_id', productId)\r\n insertData.set('order_id', orderId)\r\n insertData.set('order_item_id', orderItemId)\r\n insertData.set('share_code', shareCode)\r\n insertData.set('product_name', productName)\r\n insertData.set('product_image', productImage)\r\n insertData.set('product_price', productPrice)\r\n insertData.set('required_count', 4)\r\n insertData.set('current_count', 0)\r\n insertData.set('status', 0)\r\n\r\n const res = await supa\r\n .from('ml_share_records')\r\n .insert(insertData)\r\n .execute()\r\n\r\n if (res.error != null) {\r\n __f__('error','at utils/supabaseService.uts:7371','[createShareRecord] 插入失败:', res.error)\r\n __f__('error','at utils/supabaseService.uts:7372','[createShareRecord] 插入数据:', JSON.stringify(insertData))\r\n result.set('message', '创建分享记录失败: ' + (res.error.message ?? '未知错误'))\r\n return result\r\n }\r\n\r\n // 获取插入记录的id\r\n let insertedId = ''\r\n if (res.data != null && Array.isArray(res.data) && res.data.length > 0) {\r\n const inserted = res.data[0]\r\n let insertedObj: UTSJSONObject | null = null\r\n if (inserted instanceof UTSJSONObject) {\r\n insertedObj = inserted\r\n } else {\r\n insertedObj = JSON.parse(JSON.stringify(inserted)) as UTSJSONObject\r\n }\r\n insertedId = insertedObj.getString('id') ?? ''\r\n }\r\n\r\n result.set('success', true)\r\n result.set('id', insertedId)\r\n result.set('share_code', shareCode)\r\n result.set('message', '分享创建成功')\r\n return result\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:7396','创建分享记录失败:', e)\r\n result.set('message', '创建分享记录异常')\r\n return result\r\n }\r\n }\r\n\r\n // 生成分享码\r\n private generateShareCode(): string {\r\n const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'\r\n let result = ''\r\n for (let i = 0; i < 8; i++) {\r\n const randomIndex = Math.floor(Math.random() * chars.length)\r\n result += chars.charAt(randomIndex)\r\n }\r\n return result\r\n }\r\n\r\n // 验证分享码\r\n async validateShareCode(shareCode: string): Promise {\r\n const result = new UTSJSONObject()\r\n result.set('valid', false)\r\n result.set('share_record', null)\r\n\r\n try {\r\n const res = await supa\r\n .from('ml_share_records')\r\n .select('*')\r\n .eq('share_code', shareCode)\r\n .eq('status', 0)\r\n .limit(1)\r\n .execute()\r\n\r\n if (res.error == null && res.data != null && Array.isArray(res.data)) {\r\n const arr = res.data as any[]\r\n if (arr.length > 0) {\r\n result.set('valid', true)\r\n result.set('share_record', arr[0])\r\n }\r\n }\r\n\r\n return result\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:7438','验证分享码失败:', e)\r\n return result\r\n }\r\n }\r\n\r\n // 获取我的分享记录\r\n async getMyShareRecords(): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n const res = await supa\r\n .from('ml_share_records')\r\n .select('*')\r\n .eq('user_id', userId!)\r\n .order('created_at', { ascending: false })\r\n .execute()\r\n\r\n if (res.error != null || res.data == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n return res.data as any[]\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:7466','获取分享记录失败:', e)\r\n const empty: any[] = []\r\n return empty\r\n }\r\n }\r\n\r\n // 获取分享详情\r\n async getShareDetail(shareId: string): Promise {\r\n const result = new UTSJSONObject()\r\n result.set('share_record', null)\r\n result.set('secondary_purchases', [] as any[])\r\n\r\n try {\r\n const res = await supa\r\n .from('ml_share_records')\r\n .select('*')\r\n .eq('id', shareId)\r\n .limit(1)\r\n .execute()\r\n\r\n if (res.error == null && res.data != null && Array.isArray(res.data)) {\r\n const arr = res.data as any[]\r\n if (arr.length > 0) {\r\n result.set('share_record', arr[0])\r\n }\r\n }\r\n\r\n // 获取二级购买记录\r\n const purchasesRes = await supa\r\n .from('ml_secondary_purchases')\r\n .select('*')\r\n .eq('share_record_id', shareId)\r\n .order('created_at', { ascending: false })\r\n .execute()\r\n\r\n if (purchasesRes.error == null && purchasesRes.data != null) {\r\n result.set('secondary_purchases', purchasesRes.data)\r\n }\r\n\r\n return result\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:7507','获取分享详情失败:', e)\r\n return result\r\n }\r\n }\r\n\r\n // 获取免单奖励记录\r\n async getFreeOrderRewards(): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n const res = await supa\r\n .from('ml_free_order_rewards')\r\n .select('*')\r\n .eq('user_id', userId!)\r\n .order('created_at', { ascending: false })\r\n .execute()\r\n\r\n if (res.error != null || res.data == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n return res.data as any[]\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:7535','获取免单奖励记录失败:', e)\r\n const empty: any[] = []\r\n return empty\r\n }\r\n }\r\n\r\n // ==================== 推销模式 - 会员等级相关API ====================\r\n\r\n // 获取会员等级列表\r\n async getMemberLevels(): Promise {\r\n try {\r\n const res = await supa\r\n .from('ml_member_levels')\r\n .select('*')\r\n .eq('is_active', true)\r\n .order('level_rank', { ascending: true } as OrderOptions)\r\n .execute()\r\n\r\n if (res.error != null || res.data == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n return res.data as any[]\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:7560','获取会员等级列表失败:', e)\r\n const empty: any[] = []\r\n return empty\r\n }\r\n }\r\n\r\n // 获取用户会员信息\r\n async getUserMemberInfo(): Promise {\r\n const result = new UTSJSONObject()\r\n result.set('member_level', 0)\r\n result.set('level_name', '普通会员')\r\n result.set('discount', 1.0)\r\n result.set('total_spent', 0)\r\n result.set('next_level', null)\r\n result.set('progress_percent', 0)\r\n result.set('manual_level', false)\r\n\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) return result\r\n\r\n // 获取用户信息(包括 tier_id)\r\n const userRes = await supa\r\n .from('ml_user_profiles')\r\n .select('tier_id, total_spent, manual_level')\r\n .eq('user_id', userId!)\r\n .limit(1)\r\n .execute()\r\n\r\n let tierId: string = ''\r\n let totalSpent = 0\r\n let manualLevel = false\r\n\r\n if (userRes.error == null && userRes.data != null && Array.isArray(userRes.data)) {\r\n const arr = userRes.data as any[]\r\n if (arr.length > 0) {\r\n const item = arr[0]\r\n const itemAny = item as any\r\n if (itemAny instanceof UTSJSONObject) {\r\n tierId = itemAny.getString('tier_id') ?? ''\r\n totalSpent = itemAny.getNumber('total_spent') ?? 0\r\n manualLevel = itemAny.getBoolean('manual_level') ?? false\r\n }\r\n }\r\n }\r\n\r\n // 获取等级信息\r\n const levels = await this.getMemberLevels()\r\n let levelName = '普通会员'\r\n let discount = 1.0\r\n let nextLevel: UTSJSONObject | null = null\r\n let progressPercent = 0\r\n let currentLevelRank = 0\r\n\r\n // 通过 tier_id 匹配等级\r\n for (let i = 0; i < levels.length; i++) {\r\n const level = levels[i]\r\n const levelAny = level as any\r\n let levelId = ''\r\n let levelNameStr = ''\r\n let levelRank = 0\r\n let levelDiscount = 1.0\r\n\r\n if (levelAny instanceof UTSJSONObject) {\r\n levelId = levelAny.getString('id') ?? ''\r\n levelNameStr = levelAny.getString('name') ?? ''\r\n levelRank = levelAny.getNumber('level_rank') ?? 0\r\n levelDiscount = levelAny.getNumber('discount_rate') ?? 1.0\r\n }\r\n\r\n // 通过 tier_id 匹配当前等级\r\n if (levelId == tierId) {\r\n levelName = levelNameStr\r\n discount = levelDiscount\r\n currentLevelRank = levelRank\r\n }\r\n }\r\n\r\n // 找下一等级(level_rank 更大的第一个等级)\r\n for (let i = 0; i < levels.length; i++) {\r\n const level = levels[i]\r\n const levelAny = level as any\r\n let levelRank = 0\r\n let levelNameStr = ''\r\n let levelMinAmount = 0\r\n\r\n if (levelAny instanceof UTSJSONObject) {\r\n levelRank = levelAny.getNumber('level_rank') ?? 0\r\n levelNameStr = levelAny.getString('name') ?? ''\r\n levelMinAmount = levelAny.getNumber('min_amount') ?? 0\r\n }\r\n\r\n if (levelRank > currentLevelRank && nextLevel == null) {\r\n const nextLevelObj = new UTSJSONObject()\r\n const levelObj = level as UTSJSONObject\r\n nextLevelObj.set('id', levelObj.getString('id') ?? '')\r\n nextLevelObj.set('name', levelNameStr)\r\n nextLevelObj.set('min_amount', levelMinAmount)\r\n nextLevel = nextLevelObj\r\n }\r\n }\r\n\r\n result.set('member_level', currentLevelRank)\r\n result.set('level_name', levelName)\r\n result.set('discount', discount)\r\n result.set('total_spent', totalSpent)\r\n result.set('next_level', nextLevel)\r\n result.set('progress_percent', progressPercent)\r\n result.set('manual_level', manualLevel)\r\n\r\n return result\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:7672','获取用户会员信息失败:', e)\r\n return result\r\n }\r\n }\r\n\r\n // 获取当前等级的最低消费金额\r\n private getCurrentLevelMinAmount(levels: any[], currentLevel: number): number {\r\n for (let i = 0; i < levels.length; i++) {\r\n const level = levels[i]\r\n const levelAny = level as any\r\n if (levelAny instanceof UTSJSONObject) {\r\n const levelId = levelAny.getNumber('id') ?? 0\r\n if (levelId === currentLevel) {\r\n return levelAny.getNumber('min_amount') ?? 0\r\n }\r\n }\r\n }\r\n return 0\r\n }\r\n\r\n // 获取会员等级变更记录\r\n async getMemberLevelLogs(): Promise {\r\n try {\r\n const userId = this.getCurrentUserId()\r\n if (userId == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n const res = await supa\r\n .from('ml_member_level_logs')\r\n .select('*')\r\n .eq('user_id', userId!)\r\n .order('created_at', { ascending: false })\r\n .execute()\r\n\r\n if (res.error != null || res.data == null) {\r\n const empty: any[] = []\r\n return empty\r\n }\r\n\r\n return res.data as any[]\r\n } catch (e) {\r\n __f__('error','at utils/supabaseService.uts:7715','获取会员等级变更记录失败:', e)\r\n const empty: any[] = []\r\n return empty\r\n }\r\n }\r\n}\r\n\r\n// 导出单例实例\r\nexport const supabaseService = new SupabaseService()\r\n\r\n// 默认导出\r\nexport default supabaseService\r\n","\r\n\r\n\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n\r\n\r\n",null,null,null,null],"names":[],"mappings":";;;;;;;;;;;;;;+BAqGC,kBAAA;+BA8EA,gBAAA;AAzGD,OAAuB,0BAAmB,CAAjC,UAAA;OAAc,0BAAmB,CAAzB,UAAA;+BAqBZ,kBAAA;;+BA8OI,aAAA;;;;;;;;;YApPT,IAAM,SAAS,IAAI,KAAK;YACxB,IAAM,YAAY,IAAI;YACtB,IAAM,eAAe,IAAI;YACzB,IAAM,OAAO;gBAAC;gBAAK;gBAAM;aAAK;YAC9B,IAAM,aAAa,IAAI;YAUvB,IAAM,WAAW,SAMZ,YALH,OAAM,IACN,QAAO,IACP,SAAQ,IACR,YAAW,KAAK,EAChB,QAAO;YAGT,IAAM,cAAc,IAAO,IAAI,MAAM,GAAA,WAAA,IAAA,EAAI;gBAAA,OAAA,eAAA;wBACvC,IAAI;4BAEF,IAAM,UAAU,MAAM,gBAAgB,cAAc,CAAC;4BACrD,IAAI,QAAO,EAAA,CAAI,IAAI,EAAE;gCACnB,SAAS,IAAI,GAAG,QAAQ,cAAc;gCACtC,SAAS,KAAK,GAAG,QAAQ,KAAK;gCAC9B,SAAS,MAAM,GAAG,QAAQ,cAAc;gCACxC,SAAS,SAAS,GAAG,QAAQ,UAAU;gCACvC,SAAS,KAAK,GAAG,QAAQ,KAAK,CAAA,EAAA,CAAI;gCAClC,aAAa,KAAK,GAAG,CAAA,KAAG,QAAQ,QAAQ,GAAA,MAAI,QAAQ,IAAI,GAAA,MAAI,QAAQ,QAAQ,EAAG,IAAI;8BAC9E,IAeN,CAfM;gCAEL,IAAM,kBAAkB,AAvB7B,mBAuBgD;gCAC3C,IAAI,gBAAe,EAAA,CAAI,IAAI,EAAE;oCAC3B,IAAM,YAAW,WAAA,iBAAA,CAAC,KAAK,KAAK,CAAC,gBAAe,EAAA,CAAI,MAAM,GAAA,iDAAC,EAAA,UAAI;oCAC3D,IAAM,eAAe,UAAU,IAAI,CAAC,IAAA,OAAI,OAAA;+CAAI,KAAK,EAAE,CAAA,GAAA,CAAK;;;oCACxD,IAAI,aAAY,EAAA,CAAI,IAAI,EAAE;wCACxB,SAAS,IAAI,GAAG,aAAa,IAAI;wCACjC,SAAS,KAAK,GAAG,aAAa,KAAK;wCACnC,SAAS,MAAM,GAAG,aAAa,MAAM;wCACrC,SAAS,SAAS,GAAG,aAAa,SAAS;wCAC3C,SAAS,KAAK,GAAG,aAAa,KAAK,CAAA,EAAA,CAAI;wCACvC,aAAa,KAAK,GAAG,CAAA,KAAG,aAAa,QAAQ,GAAA,MAAI,aAAa,IAAI,GAAA,MAAI,aAAa,QAAQ,EAAG,IAAI;;;;;yBAIxG,OAAO,kBAAO;4BACd,QAAQ,KAAK,CAAC,aAAa,OAAI;4BAE/B,IAAM,kBAAkB,AAxC3B,mBAwC8C;4BAC3C,IAAI,gBAAe,EAAA,CAAI,IAAI,EAAE;gCAC3B,IAAI;oCACF,IAAM,YAAW,WAAA,iBAAA,CAAC,KAAK,KAAK,CAAC,gBAAe,EAAA,CAAI,MAAM,GAAA,iDAAC,EAAA,UAAI;oCAC3D,IAAM,UAAU,UAAU,IAAI,CAAC,IAAA,OAAI,OAAA;+CAAI,KAAK,EAAE,CAAA,GAAA,CAAK;;;oCACnD,IAAI,QAAO,EAAA,CAAI,IAAI,EAAE;wCACnB,SAAS,IAAI,GAAG,QAAQ,IAAI;wCAC5B,SAAS,KAAK,GAAG,QAAQ,KAAK;wCAC9B,SAAS,MAAM,GAAG,QAAQ,MAAM;wCAChC,SAAS,SAAS,GAAG,QAAQ,SAAS;wCACtC,SAAS,KAAK,GAAG,QAAQ,KAAK,CAAA,EAAA,CAAI;wCAClC,aAAa,KAAK,GAAG,CAAA,KAAG,QAAQ,QAAQ,GAAA,MAAI,QAAQ,IAAI,GAAA,MAAI,QAAQ,QAAQ,EAAG,IAAI;;;iCAErF,OAAO,cAAG;oCACV,QAAQ,KAAK,CAAC,cAAc,GAAA;;;;iBAInC;YAAD;YAEA,UAAO,IAAC,QAAW;gBACjB,IAAI,OAAO,CAAC,KAAK,CAAA,EAAA,CAAI,IAAI,EAAE;oBACzB,OAAO,KAAK,GAAG,IAAI;oBACnB,UAAU,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA,EAAA,CAAI,MAAM;oBACzC,YAAY,UAAU,KAAK;;YAE/B;;YAEA,IAAM,YAAY,IAAC,KAAK,MAAM,CAAI;gBAChC,IAAI,SAAS,KAAK,CAAA,GAAA,CAAK,KAAK;oBAC1B,SAAS,KAAK,GAAG;kBACZ,IAEN,CAFM;oBACL,SAAS,KAAK,GAAG;;YAErB;YAEA,IAAM,iBAAiB,IAAC,GAAG,qBAAwB;gBACjD,SAAS,SAAS,GAAG,EAAE,MAAM,CAAC,KAAK;YACrC;YAEA,IAAM,cAAc,OAAK,WAAA,IAAA,EAAM;gBAAA,OAAA,eAAA;wBAC7B,IAAI,SAAS,IAAI,CAAA,EAAA,CAAI,IAAI;4BAuJlB,+BAtJW,QAAO,UAAU,OAAM;4BACvC;;wBAEF,IAAI,SAAS,KAAK,CAAA,EAAA,CAAI,IAAI;4BAmJnB,+BAlJW,QAAO,WAAW,OAAM;4BACxC;;wBAEF,IAAI,aAAa,KAAK,CAAA,EAAA,CAAI,IAAI;4BA+IvB,+BA9IW,QAAO,WAAW,OAAM;4BACxC;;wBAEF,IAAI,SAAS,MAAM,CAAA,EAAA,CAAI,IAAI;4BA2IpB,+BA1IW,QAAO,WAAW,OAAM;4BACxC;;wBAIF,IAAM,UAAU,aAAa,KAAK,CAAC,KAAK,CAAC;wBACzC,IAAM,WAAW,OAAO,CAAC,CAAC,CAAC,CAAA,EAAA,CAAI;wBAC/B,IAAM,OAAO,OAAO,CAAC,CAAC,CAAC,CAAA,EAAA,CAAI;wBAC3B,IAAM,WAAW,QAAQ,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;wBAGvC,IAAM,cAUD,iBATH,iBAAgB,SAAS,IAAI,EAC7B,QAAO,SAAS,KAAK,EACrB,WAAU,UACV,OAAM,MACN,WAAU,UACV,iBAAgB,SAAS,MAAM,EAC/B,cAAa,IACb,aAAY,SAAS,SAAS,EAC9B,QAAO,SAAS,KAAK;wBAGvB,IAAI,UAAU,KAAK;wBAEnB,IAAI,OAAO,KAAK,EAAE;4BAEhB,IAAM,aAUC,oBATH,iBAAgB,SAAS,IAAI,EAC7B,QAAO,SAAS,KAAK,EACrB,WAAU,UACV,OAAM,MACN,WAAU,UACV,iBAAgB,SAAS,MAAM,EAC/B,cAAa,IACX,aAAY,SAAS,SAAS,EAC9B,QAAO,SAAS,KAAK;4BAEzB,UAAU,MAAM,gBAAgB,aAAa,CAAC,UAAU,KAAK,EAAE;0BAC5D,IAGN,CAHM;4BAEL,UAAU,MAAM,gBAAgB,UAAU,CAAC;;wBAG7C,IAAI,SAAS;4BAEX,IAAM,kBAAkB,AA5I3B,mBA4I8C;4BAC3C,IAAI,oBAAW,cAAY,KAAE;4BAC7B,IAAI,gBAAe,EAAA,CAAI,IAAI,EAAE;gCAC3B,IAAI;oCACF,YAAW,WAAA,iBAAA,CAAC,KAAK,KAAK,CAAC,gBAAe,EAAA,CAAI,MAAM,GAAA,iDAAC,EAAA,UAAI;;iCACrD,OAAO,cAAG;oCACV,YAAY,KAAE;;;4BAKlB,IAAI,SAAS,SAAS,EAAE;gCACtB,UAAU,OAAO,CAAC,IAAA,KAAO;oCACvB,KAAK,SAAS,GAAG,KAAK;gCACxB;;;4BAGF,IAAI,OAAO,KAAK,EAAE;gCAChB,IAAM,QAAQ,UAAU,SAAS,CAAC,IAAA,OAAI,OAAA;2CAAI,KAAK,EAAE,CAAA,GAAA,CAAK,UAAU,KAAK;;gCACrE,IAAI,MAAK,GAAA,CAAK,CAAC,CAAC,EAAE;oCAChB,SAAS,CAAC,MAAM,GAAG,qBAUlB,6BATI,SAAS,CAAC,MAAM,MACnB,UAAM,SAAS,IAAI,EACnB,WAAO,SAAS,KAAK,EACrB,cAAU,UACV,UAAM,MACN,cAAU,UACV,YAAQ,SAAS,MAAM,EACvB,eAAW,SAAS,SAAS,EAC7B,WAAO,SAAS,KAAK,GACtB,EAAA,CAAA;;8BAEE,IAaN,CAbM;gCACL,IAAM,aAAY,WAChB,KAAI,UAAQ,KAAK,GAAG,IACpB,OAAM,SAAS,IAAI,EACnB,QAAO,SAAS,KAAK,EACrB,WAAU,UACV,OAAM,MACN,WAAU,UACV,SAAQ,SAAS,MAAM,EACvB,YAAW,SAAS,SAAS,EAC7B,QAAO,SAAS,KAAK;gCAEvB,UAAU,IAAI,CAAC;6BAChB;4BA/LA,mBAiMkB,aAAa,KAAK,SAAS,CAAC;4BA6C1C,+BA1CH,QAAO,QACP,OAAM;4BAGR,WAAW,KAAK;gCApHnB;4BAsHG,GAAG,IAAI;0BACF,IAMN,CANM;4BACL,QAAQ,KAAK,CAAC,UAAO;4BAkChB,+BAhCH,QAAO,QACP,OAAM;;iBAGX;YAAD;YAEA,IAAM,kBAAkB,KAAK;gBAC3B,IAAM,QAAQ,WAAW,KAAK,CAAC,IAAI;gBACnC,IAAI,MAAK,EAAA,CAAI;oBAAI;;gBAGjB,IAAM,aAAa;gBACnB,IAAM,aAAa,MAAM,KAAK,CAAC;gBAC/B,IAAI,WAAU,EAAA,CAAI,IAAI,EAAE;oBACtB,SAAS,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA,EAAA,CAAI;;gBAIpC,IAAM,YAAY;gBAClB,IAAM,YAAY,MAAM,KAAK,CAAC;gBAC9B,IAAI,UAAS,EAAA,CAAI,IAAI,EAAE;oBACrB,SAAS,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA,EAAA,CAAI;;gBAIlC,IAAI,WAAW;gBACf,IAAI,SAAS,IAAI,CAAA,EAAA,CAAI;oBAAI,WAAW,SAAS,OAAO,CAAC,SAAS,IAAI,EAAE;;gBACpE,IAAI,SAAS,KAAK,CAAA,EAAA,CAAI;oBAAI,WAAW,SAAS,OAAO,CAAC,SAAS,KAAK,EAAE;;gBACtE,WAAW,SAAS,OAAO,CAAC,8BAAc,KAAK,IAAI;gBAGnD,IAAM,WAAW;gBACjB,IAAM,IAAI,SAAS,KAAK,CAAC;gBACzB,IAAI,EAAC,EAAA,CAAI,IAAI,EAAE;oBACb,IAAM,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA,EAAA,CAAI;oBACzB,IAAM,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA,EAAA,CAAI;oBACrB,IAAM,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA,EAAA,CAAI;oBACzB,IAAM,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA,EAAA,CAAI;oBACvB,aAAa,KAAK,GAAG,CAAA,KAAG,SAAS,IAAI,KAAE,MAAI,KAAK,IAAI,KAAE,MAAI,SAAS,IAAI,EAAE,EAAG,IAAI;oBAChF,SAAS,MAAM,GAAG,OAAO,IAAI;kBACxB,IAEN,CAFM;oBACL,SAAS,MAAM,GAAG;;YAEtB;YACA,IAAM,gBAAgB,KAAK;+CAEvB,QAAO,MACP,UAAS,cACT,UAAS,IAAC,KAAK,mBAAsB;oBACnC,IAAI,IAAI,OAAO,EAAE;wBAEf,gBAAgB,aAAa,CAAC,UAAU,KAAK,EAAE,IAAI,CAAC,IAAC,QAAW;4BAC9D,IAAI,SAAS;gCAEX,IAAM,kBAAkB,AA9PnC,mBA8PsD;gCAC3C,IAAI,gBAAe,EAAA,CAAI,IAAI,EAAE;oCAC3B,IAAI;wCACF,IAAI,YAAW,WAAA,iBAAA,CAAC,KAAK,KAAK,CAAC,gBAAe,EAAA,CAAI,MAAM,GAAA,iDAAC,EAAA,UAAI;wCACzD,YAAY,UAAU,MAAM,CAAC,IAAA,OAAI,OAAA;mDAAI,KAAK,EAAE,CAAA,GAAA,CAAK,UAAU,KAAK;;;wCAxQ3E,mBAyQ8B,aAAa,KAAK,SAAS,CAAC;;qCAC/C,OAAO,cAAG;wCACV,QAAQ,KAAK,CAAC,cAAc,GAAA;;;gCA7BnC,+BAkCK,QAAO,QACP,OAAM;gCAGR,WAAW,KAAK;oCAhM3B;gCAkMW,GAAG,IAAI;8BACF,IAMN,CANM;gCACL,QAAQ,KAAK,CAAC,UAAO;gCA1CxB,+BA4CK,QAAO,QACP,OAAM;;wBAGZ;;;gBAEJ;;YAEJ;;;uBAhYE,IAoEO,QAAA,IApED,WAAM,mBAAgB;oBAC1B,IAkEc,eAAA,IAlED,WAAM,uBAAsB,cAAS;wBAChD,IAgEO,QAAA,IAhED,WAAM,yBAAsB;4BAEhC,IAkBO,QAAA,IAlBD,WAAM,eAAY;gCACtB,IAGO,QAAA,IAHD,WAAM,cAAW;oCACrB,IAA8B,QAAA,IAAxB,WAAM,UAAQ;oCACpB,IAAsG,SAAA,IAA/F,WAAM,yBAAiB,SAAS,IAAI;wCAAb,SAAS,IAAI,GAAA,SAAA,MAAA,CAAA,KAAA;oCAAA;sCAAE,iBAAY,YAAW,uBAAkB;;;;;gCAExF,IAGO,QAAA,IAHD,WAAM,cAAW;oCACrB,IAA+B,QAAA,IAAzB,WAAM,UAAQ;oCACpB,IAAmI,SAAA,IAA5H,WAAM,yBAAiB,SAAS,KAAK;wCAAd,SAAS,KAAK,GAAA,SAAA,MAAA,CAAA,KAAA;oCAAA;sCAAE,UAAK,UAAS,eAAU,MAAK,iBAAY,WAAU,uBAAkB;;;;;gCAErH,IAIO,QAAA,IAJD,WAAM,cAAW;oCACrB,IAA+B,QAAA,IAAzB,WAAM,UAAQ;oCACpB,IAAqG,SAAA,IAA9F,WAAM,yBAAiB,aAAA,KAAY;wCAAZ,aAAY,KAAA,GAAA,SAAA,MAAA,CAAA,KAAA;oCAAA;sCAAE,iBAAY,YAAW,uBAAkB;;;;oCACrF,IAAiC,QAAA,IAA3B,WAAM,eAAa;;gCAE3B,IAGO,QAAA,IAHD,WAAM,0BAAuB;oCACjC,IAA+B,QAAA,IAAzB,WAAM,UAAQ;oCACpB,IAAsI,YAAA,IAA5H,WAAM,4BAAoB,SAAS,MAAM;wCAAf,SAAS,MAAM,GAAA,SAAA,MAAA,CAAA,KAAA;oCAAA;sCAAE,iBAAY,WAAU,uBAAkB,eAAc,eAAU;;;;;;4BAKzH,IAsBO,QAAA,IAtBD,WAAM,eAAY;gCACtB,IAaO,QAAA,IAbD,WAAM,4BAAyB;oCACnC,IAA+B,QAAA,IAAzB,WAAM,UAAQ;oCACpB,IAUO,QAAA,IAVD,WAAM,mBAAgB;wCAC1B,IAQO,UAAA,IAAA,EAAA,cAAA,UAAA,CAPS,MAAI,IAAX,KAAA,OAAA,SAAG,UAAA,GAAA,CAAA;mDADZ,IAQO,QAAA,IANJ,SAAK,KACN,WAAK,IAAA;gDAAC;gDACE,IAAA,aAAA,SAAA,KAAA,CAAA,GAAA,CAAA;6CAAkC,GACzC,aAAK,KAAA;gDAAE,UAAU;4CAAG;;gDAErB,IAA8F,QAAA,IAAxF,WAAK,IAAA;oDAAC;oDAAmB,IAAA,sBAAA,SAAA,KAAA,CAAA,GAAA,CAAA;iDAA6C,QAAK,MAAG,CAAA;;;;;;;;gCAI1F,IAMO,QAAA,IAND,WAAM,0BAAuB;oCACjC,IAGO,QAAA,IAHD,WAAM,uBAAoB;wCAC9B,IAAiC,QAAA,IAA3B,WAAM,UAAQ;wCACpB,IAAyC,QAAA,IAAnC,WAAM,cAAY;;oCAE1B,IAAiF,mBAAA,IAAxE,aAAS,SAAS,SAAS,EAAE,WAAM,WAAW,cAAQ;;;;;4BAKnE,IASO,QAAA,IATD,WAAM,2BAAwB;gCAClC,IAGO,QAAA,IAHD,WAAM,iBAAc;oCACxB,IAAqC,QAAA,IAA/B,WAAM,gBAAc;+CACM,WAAA,KAAU,GAA1C;wCAAA,IAA8E,QAAA,gBAAxE,WAAM,eAAiC,aAAK,KAAA;4CAAE,WAAA,KAAU,GAAA;wCAAA,IAAO,MAAE,CAAA,EAAA;4CAAA;yCAAA;oCAAA;;;;gCAEzE,IAA4I,YAAA,IAAlI,WAAM,kCAA0B,WAAA,KAAU,mBAA2D,GAAA;oCAArE,WAAU,KAAA,GAAA,SAAA,MAAA,CAAA,KAAA;gCAAA;kCAA4C,kBAA1C,iBAAY,uBAA+C,eAAU;;;;gCAC3H,IAEO,QAAA,IAFD,WAAM,iBAAc;oCACxB,IAA0D,QAAA,IAApD,WAAM,cAAY;;;4BAK5B,IAGO,QAAA,IAHD,WAAM,mBAAgB;gCAC1B,IAA2D,UAAA,IAAnD,WAAM,YAAY,aAAO,cAAa;2CAChC,OAAA,KAAM,GAApB;oCAAA,IAA8E,UAAA,gBAAxD,WAAM,cAAc,aAAO,gBAAe;gCAAK"} \ No newline at end of file +{"version":3,"sources":["pages/mall/consumer/address-edit.uvue","uni_modules/ak-req/ak-req.uts","pages/user/terms.uvue","pages/main/index.uvue","pages/user/center.uvue"],"sourcesContent":["\r\n\r\n\r\n\r\n\r\n\r\n",null,null,null,null],"names":[],"mappings":";;;;;;;;;;;;;;+BAqGC,kBAAA;+BAxBc,gBAAA;AAHf,OAAuB,0BAAmB,CAAzB,UAAA;+BAqBZ,kBAAA;+BAmFH,aAAA;+BA2JO,aAAA;;;;;;;;;YApPT,IAAM,SAAS,IAAI,KAAK;YACxB,IAAM,YAAY,IAAI;YACtB,IAAM,eAAe,IAAI;YACzB,IAAM,OAAO;gBAAC;gBAAK;gBAAM;aAAK;YAC9B,IAAM,aAAa,IAAI;YAUvB,IAAM,WAAW,SAMZ,YALH,OAAM,IACN,QAAO,IACP,SAAQ,IACR,YAAW,KAAK,EAChB,QAAO;YAGT,IAAM,cAAc,IAAO,IAAI,MAAM,GAAA,WAAA,IAAA,EAAI;gBAAA,OAAA,eAAA;wBACvC,IAAI;4BAEF,IAAM,UAAU,MAAM,gBAAgB,cAAc,CAAC;4BACrD,IAAI,QAAO,EAAA,CAAI,IAAI,EAAE;gCACnB,SAAS,IAAI,GAAG,QAAQ,cAAc;gCACtC,SAAS,KAAK,GAAG,QAAQ,KAAK;gCAC9B,SAAS,MAAM,GAAG,QAAQ,cAAc;gCACxC,SAAS,SAAS,GAAG,QAAQ,UAAU;gCACvC,SAAS,KAAK,GAAG,QAAQ,KAAK,CAAA,EAAA,CAAI;gCAClC,aAAa,KAAK,GAAG,CAAA,KAAG,QAAQ,QAAQ,GAAA,MAAI,QAAQ,IAAI,GAAA,MAAI,QAAQ,QAAQ,EAAG,IAAI;8BAC9E,IAeN,CAfM;gCAEL,IAAM,kBAAkB,AAvB7B,mBAuBgD;gCAC3C,IAAI,gBAAe,EAAA,CAAI,IAAI,EAAE;oCAC3B,IAAM,YAAW,WAAA,iBAAA,CAAC,KAAK,KAAK,CAAC,gBAAe,EAAA,CAAI,MAAM,GAAA,iDAAC,EAAA,UAAI;oCAC3D,IAAM,eAAe,UAAU,IAAI,CAAC,IAAA,OAAI,OAAA;+CAAI,KAAK,EAAE,CAAA,GAAA,CAAK;;;oCACxD,IAAI,aAAY,EAAA,CAAI,IAAI,EAAE;wCACxB,SAAS,IAAI,GAAG,aAAa,IAAI;wCACjC,SAAS,KAAK,GAAG,aAAa,KAAK;wCACnC,SAAS,MAAM,GAAG,aAAa,MAAM;wCACrC,SAAS,SAAS,GAAG,aAAa,SAAS;wCAC3C,SAAS,KAAK,GAAG,aAAa,KAAK,CAAA,EAAA,CAAI;wCACvC,aAAa,KAAK,GAAG,CAAA,KAAG,aAAa,QAAQ,GAAA,MAAI,aAAa,IAAI,GAAA,MAAI,aAAa,QAAQ,EAAG,IAAI;;;;;yBAIxG,OAAO,kBAAO;4BACd,QAAQ,KAAK,CAAC,aAAa,OAAI;4BAE/B,IAAM,kBAAkB,AAxC3B,mBAwC8C;4BAC3C,IAAI,gBAAe,EAAA,CAAI,IAAI,EAAE;gCAC3B,IAAI;oCACF,IAAM,YAAW,WAAA,iBAAA,CAAC,KAAK,KAAK,CAAC,gBAAe,EAAA,CAAI,MAAM,GAAA,iDAAC,EAAA,UAAI;oCAC3D,IAAM,UAAU,UAAU,IAAI,CAAC,IAAA,OAAI,OAAA;+CAAI,KAAK,EAAE,CAAA,GAAA,CAAK;;;oCACnD,IAAI,QAAO,EAAA,CAAI,IAAI,EAAE;wCACnB,SAAS,IAAI,GAAG,QAAQ,IAAI;wCAC5B,SAAS,KAAK,GAAG,QAAQ,KAAK;wCAC9B,SAAS,MAAM,GAAG,QAAQ,MAAM;wCAChC,SAAS,SAAS,GAAG,QAAQ,SAAS;wCACtC,SAAS,KAAK,GAAG,QAAQ,KAAK,CAAA,EAAA,CAAI;wCAClC,aAAa,KAAK,GAAG,CAAA,KAAG,QAAQ,QAAQ,GAAA,MAAI,QAAQ,IAAI,GAAA,MAAI,QAAQ,QAAQ,EAAG,IAAI;;;iCAErF,OAAO,cAAG;oCACV,QAAQ,KAAK,CAAC,cAAc,GAAA;;;;iBAInC;YAAD;YAEA,UAAO,IAAC,QAAW;gBACjB,IAAI,OAAO,CAAC,KAAK,CAAA,EAAA,CAAI,IAAI,EAAE;oBACzB,OAAO,KAAK,GAAG,IAAI;oBACnB,UAAU,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA,EAAA,CAAI,MAAM;oBACzC,YAAY,UAAU,KAAK;;YAE/B;;YAEA,IAAM,YAAY,IAAC,KAAK,MAAM,CAAI;gBAChC,IAAI,SAAS,KAAK,CAAA,GAAA,CAAK,KAAK;oBAC1B,SAAS,KAAK,GAAG;kBACZ,IAEN,CAFM;oBACL,SAAS,KAAK,GAAG;;YAErB;YAEA,IAAM,iBAAiB,IAAC,GAAG,qBAAwB;gBACjD,SAAS,SAAS,GAAG,EAAE,MAAM,CAAC,KAAK;YACrC;YAEA,IAAM,cAAc,OAAK,WAAA,IAAA,EAAM;gBAAA,OAAA,eAAA;wBAC7B,IAAI,SAAS,IAAI,CAAA,EAAA,CAAI,IAAI;4BAuJlB,+BAtJW,QAAO,UAAU,OAAM;4BACvC;;wBAEF,IAAI,SAAS,KAAK,CAAA,EAAA,CAAI,IAAI;4BAmJnB,+BAlJW,QAAO,WAAW,OAAM;4BACxC;;wBAEF,IAAI,aAAa,KAAK,CAAA,EAAA,CAAI,IAAI;4BA+IvB,+BA9IW,QAAO,WAAW,OAAM;4BACxC;;wBAEF,IAAI,SAAS,MAAM,CAAA,EAAA,CAAI,IAAI;4BA2IpB,+BA1IW,QAAO,WAAW,OAAM;4BACxC;;wBAIF,IAAM,UAAU,aAAa,KAAK,CAAC,KAAK,CAAC;wBACzC,IAAM,WAAW,OAAO,CAAC,CAAC,CAAC,CAAA,EAAA,CAAI;wBAC/B,IAAM,OAAO,OAAO,CAAC,CAAC,CAAC,CAAA,EAAA,CAAI;wBAC3B,IAAM,WAAW,QAAQ,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;wBAGvC,IAAM,cAUD,iBATH,iBAAgB,SAAS,IAAI,EAC7B,QAAO,SAAS,KAAK,EACrB,WAAU,UACV,OAAM,MACN,WAAU,UACV,iBAAgB,SAAS,MAAM,EAC/B,cAAa,IACb,aAAY,SAAS,SAAS,EAC9B,QAAO,SAAS,KAAK;wBAGvB,IAAI,UAAU,KAAK;wBAEnB,IAAI,OAAO,KAAK,EAAE;4BAEhB,IAAM,aAUC,oBATH,iBAAgB,SAAS,IAAI,EAC7B,QAAO,SAAS,KAAK,EACrB,WAAU,UACV,OAAM,MACN,WAAU,UACV,iBAAgB,SAAS,MAAM,EAC/B,cAAa,IACX,aAAY,SAAS,SAAS,EAC9B,QAAO,SAAS,KAAK;4BAEzB,UAAU,MAAM,gBAAgB,aAAa,CAAC,UAAU,KAAK,EAAE;0BAC5D,IAGN,CAHM;4BAEL,UAAU,MAAM,gBAAgB,UAAU,CAAC;;wBAG7C,IAAI,SAAS;4BAEX,IAAM,kBAAkB,AA5I3B,mBA4I8C;4BAC3C,IAAI,oBAAW,cAAY,KAAE;4BAC7B,IAAI,gBAAe,EAAA,CAAI,IAAI,EAAE;gCAC3B,IAAI;oCACF,YAAW,WAAA,iBAAA,CAAC,KAAK,KAAK,CAAC,gBAAe,EAAA,CAAI,MAAM,GAAA,iDAAC,EAAA,UAAI;;iCACrD,OAAO,cAAG;oCACV,YAAY,KAAE;;;4BAKlB,IAAI,SAAS,SAAS,EAAE;gCACtB,UAAU,OAAO,CAAC,IAAA,KAAO;oCACvB,KAAK,SAAS,GAAG,KAAK;gCACxB;;;4BAGF,IAAI,OAAO,KAAK,EAAE;gCAChB,IAAM,QAAQ,UAAU,SAAS,CAAC,IAAA,OAAI,OAAA;2CAAI,KAAK,EAAE,CAAA,GAAA,CAAK,UAAU,KAAK;;gCACrE,IAAI,MAAK,GAAA,CAAK,CAAC,CAAC,EAAE;oCAChB,SAAS,CAAC,MAAM,GAAG,qBAUlB,6BATI,SAAS,CAAC,MAAM,MACnB,UAAM,SAAS,IAAI,EACnB,WAAO,SAAS,KAAK,EACrB,cAAU,UACV,UAAM,MACN,cAAU,UACV,YAAQ,SAAS,MAAM,EACvB,eAAW,SAAS,SAAS,EAC7B,WAAO,SAAS,KAAK,GACtB,EAAA,CAAA;;8BAEE,IAaN,CAbM;gCACL,IAAM,aAAY,WAChB,KAAI,UAAQ,KAAK,GAAG,IACpB,OAAM,SAAS,IAAI,EACnB,QAAO,SAAS,KAAK,EACrB,WAAU,UACV,OAAM,MACN,WAAU,UACV,SAAQ,SAAS,MAAM,EACvB,YAAW,SAAS,SAAS,EAC7B,QAAO,SAAS,KAAK;gCAEvB,UAAU,IAAI,CAAC;6BAChB;4BA/LA,mBAiMkB,aAAa,KAAK,SAAS,CAAC;4BA6C1C,+BA1CH,QAAO,QACP,OAAM;4BAGR,WAAW,KAAK;gCA1NL;4BA4NX,GAAG,IAAI;0BACF,IAMN,CANM;4BACL,QAAQ,KAAK,CAAC,UAAO;4BAkChB,+BAhCH,QAAO,QACP,OAAM;;iBAGX;YAAD;YAEA,IAAM,kBAAkB,KAAK;gBAC3B,IAAM,QAAQ,WAAW,KAAK,CAAC,IAAI;gBACnC,IAAI,MAAK,EAAA,CAAI;oBAAI;;gBAGjB,IAAM,aAAa;gBACnB,IAAM,aAAa,MAAM,KAAK,CAAC;gBAC/B,IAAI,WAAU,EAAA,CAAI,IAAI,EAAE;oBACtB,SAAS,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA,EAAA,CAAI;;gBAIpC,IAAM,YAAY;gBAClB,IAAM,YAAY,MAAM,KAAK,CAAC;gBAC9B,IAAI,UAAS,EAAA,CAAI,IAAI,EAAE;oBACrB,SAAS,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA,EAAA,CAAI;;gBAIlC,IAAI,WAAW;gBACf,IAAI,SAAS,IAAI,CAAA,EAAA,CAAI;oBAAI,WAAW,SAAS,OAAO,CAAC,SAAS,IAAI,EAAE;;gBACpE,IAAI,SAAS,KAAK,CAAA,EAAA,CAAI;oBAAI,WAAW,SAAS,OAAO,CAAC,SAAS,KAAK,EAAE;;gBACtE,WAAW,SAAS,OAAO,CAAC,8BAAc,KAAK,IAAI;gBAGnD,IAAM,WAAW;gBACjB,IAAM,IAAI,SAAS,KAAK,CAAC;gBACzB,IAAI,EAAC,EAAA,CAAI,IAAI,EAAE;oBACb,IAAM,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA,EAAA,CAAI;oBACzB,IAAM,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA,EAAA,CAAI;oBACrB,IAAM,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA,EAAA,CAAI;oBACzB,IAAM,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA,EAAA,CAAI;oBACvB,aAAa,KAAK,GAAG,CAAA,KAAG,SAAS,IAAI,KAAE,MAAI,KAAK,IAAI,KAAE,MAAI,SAAS,IAAI,EAAE,EAAG,IAAI;oBAChF,SAAS,MAAM,GAAG,OAAO,IAAI;kBACxB,IAEN,CAFM;oBACL,SAAS,MAAM,GAAG;;YAEtB;YACA,IAAM,gBAAgB,KAAK;gBAvKzB,+BAyKE,QAAO,MACP,UAAS,cACT,UAAS,IAAC,KAAK,mBAAsB;oBACnC,IAAI,IAAI,OAAO,EAAE;wBAEf,gBAAgB,aAAa,CAAC,UAAU,KAAK,EAAE,IAAI,CAAC,IAAC,QAAW;4BAC9D,IAAI,SAAS;gCAEX,IAAM,kBAAkB,AA9PnC,mBA8PsD;gCAC3C,IAAI,gBAAe,EAAA,CAAI,IAAI,EAAE;oCAC3B,IAAI;wCACF,IAAI,YAAW,WAAA,iBAAA,CAAC,KAAK,KAAK,CAAC,gBAAe,EAAA,CAAI,MAAM,GAAA,iDAAC,EAAA,UAAI;wCACzD,YAAY,UAAU,MAAM,CAAC,IAAA,OAAI,OAAA;mDAAI,KAAK,EAAE,CAAA,GAAA,CAAK,UAAU,KAAK;;;wCAxQ3E,mBAyQ8B,aAAa,KAAK,SAAS,CAAC;;qCAC/C,OAAO,cAAG;wCACV,QAAQ,KAAK,CAAC,cAAc,GAAA;;;gCA7BnC,+BAkCK,QAAO,QACP,OAAM;gCAGR,WAAW,KAAK;oCAtSb;gCAwSH,GAAG,IAAI;8BACF,IAMN,CANM;gCACL,QAAQ,KAAK,CAAC,UAAO;gCA1CxB,+BA4CK,QAAO,QACP,OAAM;;wBAGZ;;;gBAEJ;;YAEJ;;;uBAhYE,IAoEO,QAAA,IApED,WAAM,mBAAgB;oBAC1B,IAkEc,eAAA,IAlED,WAAM,uBAAsB,cAAS;wBAChD,IAgEO,QAAA,IAhED,WAAM,yBAAsB;4BAEhC,IAkBO,QAAA,IAlBD,WAAM,eAAY;gCACtB,IAGO,QAAA,IAHD,WAAM,cAAW;oCACrB,IAA8B,QAAA,IAAxB,WAAM,UAAQ;oCACpB,IAAsG,SAAA,IAA/F,WAAM,yBAAiB,SAAS,IAAI;wCAAb,SAAS,IAAI,GAAA,SAAA,MAAA,CAAA,KAAA;oCAAA;sCAAE,iBAAY,YAAW,uBAAkB;;;;;gCAExF,IAGO,QAAA,IAHD,WAAM,cAAW;oCACrB,IAA+B,QAAA,IAAzB,WAAM,UAAQ;oCACpB,IAAmI,SAAA,IAA5H,WAAM,yBAAiB,SAAS,KAAK;wCAAd,SAAS,KAAK,GAAA,SAAA,MAAA,CAAA,KAAA;oCAAA;sCAAE,UAAK,UAAS,eAAU,MAAK,iBAAY,WAAU,uBAAkB;;;;;gCAErH,IAIO,QAAA,IAJD,WAAM,cAAW;oCACrB,IAA+B,QAAA,IAAzB,WAAM,UAAQ;oCACpB,IAAqG,SAAA,IAA9F,WAAM,yBAAiB,aAAA,KAAY;wCAAZ,aAAY,KAAA,GAAA,SAAA,MAAA,CAAA,KAAA;oCAAA;sCAAE,iBAAY,YAAW,uBAAkB;;;;oCACrF,IAAiC,QAAA,IAA3B,WAAM,eAAa;;gCAE3B,IAGO,QAAA,IAHD,WAAM,0BAAuB;oCACjC,IAA+B,QAAA,IAAzB,WAAM,UAAQ;oCACpB,IAAsI,YAAA,IAA5H,WAAM,4BAAoB,SAAS,MAAM;wCAAf,SAAS,MAAM,GAAA,SAAA,MAAA,CAAA,KAAA;oCAAA;sCAAE,iBAAY,WAAU,uBAAkB,eAAc,eAAU;;;;;;4BAKzH,IAsBO,QAAA,IAtBD,WAAM,eAAY;gCACtB,IAaO,QAAA,IAbD,WAAM,4BAAyB;oCACnC,IAA+B,QAAA,IAAzB,WAAM,UAAQ;oCACpB,IAUO,QAAA,IAVD,WAAM,mBAAgB;wCAC1B,IAQO,UAAA,IAAA,EAAA,cAAA,UAAA,CAPS,MAAI,IAAX,KAAA,OAAA,SAAG,UAAA,GAAA,CAAA;mDADZ,IAQO,QAAA,IANJ,SAAK,KACN,WAAK,IAAA;gDAAC;gDACE,IAAA,aAAA,SAAA,KAAA,CAAA,GAAA,CAAA;6CAAkC,GACzC,aAAK,KAAA;gDAAE,UAAU;4CAAG;;gDAErB,IAA8F,QAAA,IAAxF,WAAK,IAAA;oDAAC;oDAAmB,IAAA,sBAAA,SAAA,KAAA,CAAA,GAAA,CAAA;iDAA6C,QAAK,MAAG,CAAA;;;;;;;;gCAI1F,IAMO,QAAA,IAND,WAAM,0BAAuB;oCACjC,IAGO,QAAA,IAHD,WAAM,uBAAoB;wCAC9B,IAAiC,QAAA,IAA3B,WAAM,UAAQ;wCACpB,IAAyC,QAAA,IAAnC,WAAM,cAAY;;oCAE1B,IAAiF,mBAAA,IAAxE,aAAS,SAAS,SAAS,EAAE,WAAM,WAAW,cAAQ;;;;;4BAKnE,IASO,QAAA,IATD,WAAM,2BAAwB;gCAClC,IAGO,QAAA,IAHD,WAAM,iBAAc;oCACxB,IAAqC,QAAA,IAA/B,WAAM,gBAAc;+CACM,WAAA,KAAU,GAA1C;wCAAA,IAA8E,QAAA,gBAAxE,WAAM,eAAiC,aAAK,KAAA;4CAAE,WAAA,KAAU,GAAA;wCAAA,IAAO,MAAE,CAAA,EAAA;4CAAA;yCAAA;oCAAA;;;;gCAEzE,IAA4I,YAAA,IAAlI,WAAM,kCAA0B,WAAA,KAAU,mBAA2D,GAAA;oCAArE,WAAU,KAAA,GAAA,SAAA,MAAA,CAAA,KAAA;gCAAA;kCAA4C,kBAA1C,iBAAY,uBAA+C,eAAU;;;;gCAC3H,IAEO,QAAA,IAFD,WAAM,iBAAc;oCACxB,IAA0D,QAAA,IAApD,WAAM,cAAY;;;4BAK5B,IAGO,QAAA,IAHD,WAAM,mBAAgB;gCAC1B,IAA2D,UAAA,IAAnD,WAAM,YAAY,aAAO,cAAa;2CAChC,OAAA,KAAM,GAApB;oCAAA,IAA8E,UAAA,gBAAxD,WAAM,cAAc,aAAO,gBAAe;gCAAK"} \ No newline at end of file diff --git a/unpackage/cache/.app-android/sourcemap/pages/mall/consumer/address-list.kt.map b/unpackage/cache/.app-android/sourcemap/pages/mall/consumer/address-list.kt.map index f74c3b66..5bb51bdc 100644 --- a/unpackage/cache/.app-android/sourcemap/pages/mall/consumer/address-list.kt.map +++ b/unpackage/cache/.app-android/sourcemap/pages/mall/consumer/address-list.kt.map @@ -1 +1 @@ -{"version":3,"sources":["pages/mall/consumer/address-list.uvue","uni_modules/ak-req/ak-req.uts","pages/mall/consumer/withdraw.uvue","pages/user/login.uvue","pages/main/index.uvue","pages/main/cart.uvue"],"sourcesContent":["\r\n\r\n\r\n\r\n\r\n\r\n",null,null,null,null,null],"names":[],"mappings":";;;;;;;;;;;;;;+BAoKQ,WAAA;+BA/GF,kBAAA;;;AAhBN,OAA+B,0BAAmB,CAAzC,UAAA;OAAsB,0BAAmB,CAAjC,UAAA;;;;;;;;;;;;YAejB,IAAM,YAAY,QAAI;YACtB,IAAM,gBAAgB,IAAI,OAAO,EAAE,KAAK;YAExC,IAAM,gBAAgB,OAAK,WAAA,IAAA,EAAM;gBAAA,OAAA,eAAA;wBAC/B,IAAI;4BAEF,IAAM,oBAAoB,MAAM,gBAAgB,YAAY;4BAG5D,IAAM,+BAAsB,WAAY,KAAE;gCAC1C;gCAAK,IAAI,YAAI,CAAC;gCAAd,MAAgB,EAAC,CAAA,CAAG,kBAAkB,MAAM;oCAC1C,IAAM,OAAO,iBAAiB,CAAC,EAAE;oCACjC,IAAM,MAAM,UAUP,QATH,KAAI,KAAK,EAAE,EACX,OAAM,KAAK,cAAc,EACzB,QAAO,KAAK,KAAK,EACjB,WAAU,KAAK,QAAQ,EACvB,OAAM,KAAK,IAAI,EACf,WAAU,KAAK,QAAQ,EACvB,SAAQ,KAAK,cAAc,EAC3B,YAAW,KAAK,UAAU,EAC1B,QAAO;oCAET,qBAAqB,IAAI,CAAC;oCAbkB;;;4BAgB9C,UAAU,KAAK,GAAG;+CAGC,aAAa,KAAK,SAAS,CAAC,UAAU,KAAK;;yBAC9D,OAAO,kBAAO;4BACd,QAAQ,KAAK,CAAC,aAAa,OAAI;4BAE/B,IAAM,kBAAkB,AAhCtB,mBAgCyC;4BAC3C,IAAI,gBAAe,EAAA,CAAI,IAAI,EAAE;gCAC3B,IAAI;oCACF,UAAU,KAAK,GAAE,WAAA,iBAAA,CAAC,KAAK,KAAK,CAAC,gBAAe,EAAA,CAAI,MAAM,GAAA,gDAAC,EAAA,UAAI;kCAC3D,OAAO,cAAG;oCACV,QAAQ,KAAK,CAAC,YAAY,GAAA;oCAC1B,UAAU,KAAK,GAAG,KAAE;;8BAEjB,IAEN,CAFM;gCACL,UAAU,KAAK,GAAG,KAAE;;;iBAGzB;YAAD;YAEA,UAAO,IAAC,QAAW;gBACjB,IAAI,OAAO,CAAC,aAAa,CAAA,EAAA,CAAI,QAAQ;oBACnC,cAAc,KAAK,GAAG,IAAI;;YAE9B;;YAEA,UAAO,KAAK;gBACV;YACF;;YAKA,IAAM,iBAAiB,IAAC,MAAM,UAAU,MAAM,CAAG;gBAC/C,OAAO,KAAG,KAAK,QAAQ,GAAG,KAAK,IAAI,GAAG,KAAK,QAAQ,GAAA,MAAI,KAAK,MAAM;YACpE;YAEA,IAAM,aAAa,KAAK;iDAEpB,MAAK;YAET;YAGA,IAAM,gBAAgB,IAAC,IAAI,MAAM,CAAI;+CAE7B,QAAO,MACP,UAAS,cACT,UAAS,IAAC,IAAO;oBACb,IAAI,IAAI,OAAO,EAAE;wBAEb,gBAAgB,aAAa,CAAC,IAAI,IAAI,CAAC,IAAC,QAAW;4BAC/C,IAAI,SAAS;gCAET,IAAM,QAAQ,UAAU,KAAK,CAAC,SAAS,CAAC,IAAA,OAAI,OAAA;2CAAI,KAAK,EAAE,CAAA,GAAA,CAAK;;gCAC5D,IAAI,MAAK,GAAA,CAAK,CAAC,CAAC,EAAE;oCACd,UAAU,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;uDAEZ,aAAa,KAAK,SAAS,CAAC,UAAU,KAAK;mEAE1D,QAAO,QACP,OAAM;;8BAGX,IAMN,CANM;gCACH,QAAQ,KAAK,CAAC,UAAO;+DAEjB,QAAO,QACP,OAAM;;wBAGlB;;;gBAER;;YAER;YAEA,IAAM,cAAc,IAAC,IAAI,MAAM,CAAI;iDAE/B,MAAK,0CAAwC;YAEjD;YAEA,IAAM,gBAAgB,IAAC,MAAM,QAAW;gBACtC,IAAI,cAAc,KAAK,EAAE;oBACnB,UAAM,mBAAmB;wBAC3B,IAAA,KAAI,KAAK,EAAE;wBACX,IAAA,iBAAgB,KAAK,IAAI;wBACzB,IAAA,QAAO,KAAK,KAAK;wBACjB,IAAA,WAAU,KAAK,QAAQ;wBACvB,IAAA,OAAM,KAAK,IAAI;wBACf,IAAA,WAAU,KAAK,QAAQ;wBACvB,IAAA,SAAQ,KAAK,MAAM;wBACnB,IAAA,aAAY,KAAK,SAAS;qBAC3B;;kBAEI,IAEN,CAFM;oBACL,YAAY,KAAK,EAAE;;YAEvB;;uBAjLE,IA+BO,QAAA,IA/BD,WAAM,sBAAmB;oBAC7B,IAyBO,QAAA,IAzBD,WAAM,iBAAc;wBACZ,IAAA,UAAA,KAAS,CAAC,MAAM,CAAA,GAAA,CAAA,CAAA,EAA5B;4BAAA,IAGO,QAAA,gBAH6B,WAAM;gCACxC,IAAkC,QAAA,IAA5B,WAAM,eAAa;gCACzB,IAAsC,QAAA,IAAhC,WAAM,eAAa;;0BAG3B,KAAA;4BAAA,IAkBO,UAAA,IAAA,SAAA,CAAA,GAAA,cAAA,UAAA,CAlB8B,UAAA,KAAS,EAAA,IAAzB,MAAM,OAAN,SAAI,UAAA,GAAA,CAAA;uCAAzB,IAkBO,QAAA,IAlB0C,SAAK,KAAK,EAAE,EAAE,WAAM,gBAAgB,aAAK,KAAA;oCAAE,cAAc;gCAAI;;oCAC5G,IAQO,QAAA,IARD,WAAM,iBAAc;wCACxB,IAKO,QAAA,IALD,WAAM,gBAAa;4CACvB,IAA8C,QAAA,IAAxC,WAAM,cAAW,IAAI,KAAK,IAAI,GAAA,CAAA;4CACpC,IAAgD,QAAA,IAA1C,WAAM,eAAY,IAAI,KAAK,KAAK,GAAA,CAAA;uDAC1B,KAAK,SAAS,GAA1B;gDAAA,IAAyD,QAAA,gBAA7B,WAAM,gBAAc;4CAAE;;;;uDACtC,KAAK,KAAK,GAAtB;gDAAA,IAAiE,QAAA,gBAAzC,WAAM,kBAAe,KAAK,KAAK,GAAA,CAAA;4CAAA;;;;wCAEzD,IAA4D,QAAA,IAAtD,WAAM,iBAAc,IAAI,eAAe,QAAI,CAAA;;oCAEnD,IAOO,QAAA,IAPD,WAAM,iBAAc;wCACtB,IAEO,QAAA,IAFD,WAAM,eAAe,aAAK,cAAA,KAAA;4CAAO,YAAY,KAAK,EAAE;wCAAA;0CAAA;4CAAA;yCAAA;4CACtD,IAAmC,QAAA,IAA7B,WAAM,gBAAc;;;;wCAE9B,IAEO,QAAA,IAFD,WAAM,eAAe,aAAK,cAAA,KAAA;4CAAO,cAAc,KAAK,EAAE;wCAAA;0CAAA;4CAAA;yCAAA;4CACxD,IAAoC,QAAA,IAA9B,WAAM,gBAAc;;;;;;;;;;;;oBAMtC,IAEO,QAAA,IAFD,WAAM,eAAY;wBACtB,IAA2D,UAAA,IAAnD,WAAM,WAAW,aAAO,aAAY"} \ No newline at end of file +{"version":3,"sources":["pages/mall/consumer/address-list.uvue","uni_modules/ak-req/ak-req.uts","pages/user/terms.uvue","pages/user/login.uvue","pages/main/index.uvue","pages/user/center.uvue"],"sourcesContent":["\r\n\r\n\r\n\r\n\r\n\r\n",null,null,null,null,null],"names":[],"mappings":";;;;;;;;;;;;;;+BAoKQ,WAAA;+BA/GF,kBAAA;+BAbS,gBAAA;;AAHf,OAA+B,0BAAmB,CAAjC,UAAA;AAAjB,OAAuB,0BAAQ,CAAtB,UAAA;;;;;;;;;;;;YAeT,IAAM,YAAY,QAAI;YACtB,IAAM,gBAAgB,IAAI,OAAO,EAAE,KAAK;YAExC,IAAM,gBAAgB,OAAK,WAAA,IAAA,EAAM;gBAAA,OAAA,eAAA;wBAC/B,IAAI;4BAEF,IAAM,oBAAoB,MAAM,gBAAgB,YAAY;4BAG5D,IAAM,+BAAsB,WAAY,KAAE;gCAC1C;gCAAK,IAAI,YAAI,CAAC;gCAAd,MAAgB,EAAC,CAAA,CAAG,kBAAkB,MAAM;oCAC1C,IAAM,OAAO,iBAAiB,CAAC,EAAE;oCACjC,IAAM,MAAM,UAUP,QATH,KAAI,KAAK,EAAE,EACX,OAAM,KAAK,cAAc,EACzB,QAAO,KAAK,KAAK,EACjB,WAAU,KAAK,QAAQ,EACvB,OAAM,KAAK,IAAI,EACf,WAAU,KAAK,QAAQ,EACvB,SAAQ,KAAK,cAAc,EAC3B,YAAW,KAAK,UAAU,EAC1B,QAAO;oCAET,qBAAqB,IAAI,CAAC;oCAbkB;;;4BAgB9C,UAAU,KAAK,GAAG;+CAGC,aAAa,KAAK,SAAS,CAAC,UAAU,KAAK;;yBAC9D,OAAO,kBAAO;4BACd,QAAQ,KAAK,CAAC,aAAa,OAAI;4BAE/B,IAAM,kBAAkB,AAhCtB,mBAgCyC;4BAC3C,IAAI,gBAAe,EAAA,CAAI,IAAI,EAAE;gCAC3B,IAAI;oCACF,UAAU,KAAK,GAAE,WAAA,iBAAA,CAAC,KAAK,KAAK,CAAC,gBAAe,EAAA,CAAI,MAAM,GAAA,gDAAC,EAAA,UAAI;kCAC3D,OAAO,cAAG;oCACV,QAAQ,KAAK,CAAC,YAAY,GAAA;oCAC1B,UAAU,KAAK,GAAG,KAAE;;8BAEjB,IAEN,CAFM;gCACL,UAAU,KAAK,GAAG,KAAE;;;iBAGzB;YAAD;YAEA,UAAO,IAAC,QAAW;gBACjB,IAAI,OAAO,CAAC,aAAa,CAAA,EAAA,CAAI,QAAQ;oBACnC,cAAc,KAAK,GAAG,IAAI;;YAE9B;;YAEA,UAAO,KAAK;gBACV;YACF;;YAKA,IAAM,iBAAiB,IAAC,MAAM,UAAU,MAAM,CAAG;gBAC/C,OAAO,KAAG,KAAK,QAAQ,GAAG,KAAK,IAAI,GAAG,KAAK,QAAQ,GAAA,MAAI,KAAK,MAAM;YACpE;YAEA,IAAM,aAAa,KAAK;iDAEpB,MAAK;YAET;YAGA,IAAM,gBAAgB,IAAC,IAAI,MAAM,CAAI;+CAE7B,QAAO,MACP,UAAS,cACT,UAAS,IAAC,IAAO;oBACb,IAAI,IAAI,OAAO,EAAE;wBAEb,gBAAgB,aAAa,CAAC,IAAI,IAAI,CAAC,IAAC,QAAW;4BAC/C,IAAI,SAAS;gCAET,IAAM,QAAQ,UAAU,KAAK,CAAC,SAAS,CAAC,IAAA,OAAI,OAAA;2CAAI,KAAK,EAAE,CAAA,GAAA,CAAK;;gCAC5D,IAAI,MAAK,GAAA,CAAK,CAAC,CAAC,EAAE;oCACd,UAAU,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;uDAEZ,aAAa,KAAK,SAAS,CAAC,UAAU,KAAK;mEAE1D,QAAO,QACP,OAAM;;8BAGX,IAMN,CANM;gCACH,QAAQ,KAAK,CAAC,UAAO;+DAEjB,QAAO,QACP,OAAM;;wBAGlB;;;gBAER;;YAER;YAEA,IAAM,cAAc,IAAC,IAAI,MAAM,CAAI;iDAE/B,MAAK,0CAAwC;YAEjD;YAEA,IAAM,gBAAgB,IAAC,MAAM,QAAW;gBACtC,IAAI,cAAc,KAAK,EAAE;oBACnB,UAAM,mBAAmB;wBAC3B,IAAA,KAAI,KAAK,EAAE;wBACX,IAAA,iBAAgB,KAAK,IAAI;wBACzB,IAAA,QAAO,KAAK,KAAK;wBACjB,IAAA,WAAU,KAAK,QAAQ;wBACvB,IAAA,OAAM,KAAK,IAAI;wBACf,IAAA,WAAU,KAAK,QAAQ;wBACvB,IAAA,SAAQ,KAAK,MAAM;wBACnB,IAAA,aAAY,KAAK,SAAS;qBAC3B;oBArIU;kBAuIN,IAEN,CAFM;oBACL,YAAY,KAAK,EAAE;;YAEvB;;uBAjLE,IA+BO,QAAA,IA/BD,WAAM,sBAAmB;oBAC7B,IAyBO,QAAA,IAzBD,WAAM,iBAAc;wBACZ,IAAA,UAAA,KAAS,CAAC,MAAM,CAAA,GAAA,CAAA,CAAA,EAA5B;4BAAA,IAGO,QAAA,gBAH6B,WAAM;gCACxC,IAAkC,QAAA,IAA5B,WAAM,eAAa;gCACzB,IAAsC,QAAA,IAAhC,WAAM,eAAa;;0BAG3B,KAAA;4BAAA,IAkBO,UAAA,IAAA,SAAA,CAAA,GAAA,cAAA,UAAA,CAlB8B,UAAA,KAAS,EAAA,IAAzB,MAAM,OAAN,SAAI,UAAA,GAAA,CAAA;uCAAzB,IAkBO,QAAA,IAlB0C,SAAK,KAAK,EAAE,EAAE,WAAM,gBAAgB,aAAK,KAAA;oCAAE,cAAc;gCAAI;;oCAC5G,IAQO,QAAA,IARD,WAAM,iBAAc;wCACxB,IAKO,QAAA,IALD,WAAM,gBAAa;4CACvB,IAA8C,QAAA,IAAxC,WAAM,cAAW,IAAI,KAAK,IAAI,GAAA,CAAA;4CACpC,IAAgD,QAAA,IAA1C,WAAM,eAAY,IAAI,KAAK,KAAK,GAAA,CAAA;uDAC1B,KAAK,SAAS,GAA1B;gDAAA,IAAyD,QAAA,gBAA7B,WAAM,gBAAc;4CAAE;;;;uDACtC,KAAK,KAAK,GAAtB;gDAAA,IAAiE,QAAA,gBAAzC,WAAM,kBAAe,KAAK,KAAK,GAAA,CAAA;4CAAA;;;;wCAEzD,IAA4D,QAAA,IAAtD,WAAM,iBAAc,IAAI,eAAe,QAAI,CAAA;;oCAEnD,IAOO,QAAA,IAPD,WAAM,iBAAc;wCACtB,IAEO,QAAA,IAFD,WAAM,eAAe,aAAK,cAAA,KAAA;4CAAO,YAAY,KAAK,EAAE;wCAAA;0CAAA;4CAAA;yCAAA;4CACtD,IAAmC,QAAA,IAA7B,WAAM,gBAAc;;;;wCAE9B,IAEO,QAAA,IAFD,WAAM,eAAe,aAAK,cAAA,KAAA;4CAAO,cAAc,KAAK,EAAE;wCAAA;0CAAA;4CAAA;yCAAA;4CACxD,IAAoC,QAAA,IAA9B,WAAM,gBAAc;;;;;;;;;;;;oBAMtC,IAEO,QAAA,IAFD,WAAM,eAAY;wBACtB,IAA2D,UAAA,IAAnD,WAAM,WAAW,aAAO,aAAY"} \ No newline at end of file diff --git a/unpackage/cache/.app-android/sourcemap/pages/mall/consumer/apply-refund.kt.map b/unpackage/cache/.app-android/sourcemap/pages/mall/consumer/apply-refund.kt.map index 93d10cb2..5d21e9ca 100644 --- a/unpackage/cache/.app-android/sourcemap/pages/mall/consumer/apply-refund.kt.map +++ b/unpackage/cache/.app-android/sourcemap/pages/mall/consumer/apply-refund.kt.map @@ -1 +1 @@ -{"version":3,"sources":["pages/mall/consumer/apply-refund.uvue","pages/main/index.uvue","pages/mall/consumer/withdraw.uvue","uni_modules/ak-req/ak-req.uts"],"sourcesContent":["